Function `zend_hash_find_bucket` consumes much time in WordPress workload
Nessuno ha ancora preso questa issue.
- Lingua principale
- C
- Stelle
- 40.4k
- Fork
- 8.1k
- Merge medio
- 2g 13h
- PR unite (30g)
- 96
Descrizione
Description
Dear, maintainers:
I am utilizing PHP-FPM and have profiled performance data for a WordPress workload. Within this benchmark, I've identified certain hotspots. The performance analysis from 'perf' highlights that functions such as zend_hash_find and zend_hash_find_known_hash are consuming a considerable amount of time. Upon investigation, I suspect that the core issue lies within the zend_hash_find_bucket function.
Upon inspecting the assembly code and annotating it, I noticed that certain 'mov' instructions are causing significant delays. To address this, I attempted to optimize the zend_hash_find_bucket function. I experimented with optimizations such as utilizing prefetch instructions and employing struct alignment. However, these optimizations did not seem to have a discernible impact on performance.
Percent│
│
│
│ Disassembly of section .text:
│
│ 0000000000532ae0 <zend_hash_find>:
│ zend_hash_find():
0.84 │ push %r12
0.04 │ push %rbp
0.01 │ mov %rsi,%rbp
2.52 │ push %rbx
│ zend_string_hash_val():
8.01 │ mov 0x8(%rsi),%rax
│ zend_hash_find():
0.02 │ mov %rdi,%rbx
│ zend_string_hash_val():
0.12 │ test %rax,%rax
0.14 │ ↓ je 78
│ zend_hash_find_bucket():
5.63 │13: or 0xc(%rbx),%eax
0.28 │ mov 0x10(%rbx),%r12
0.16 │ cltq
25.03 │ mov (%r12,%rax,4),%ebx
1.98 │ cmp $0xffffffff,%ebx
0.56 │ ↓ je a0
0.85 │ shl $0x5,%rbx
0.50 │ add %r12,%rbx
15.20 │ cmp 0x18(%rbx),%rbp
12.97 │ ↓ jne 68
│ zend_hash_find():
1.41 │32: mov %rbx,%rax
0.60 │ pop %rbx
0.03 │ pop %rbp
1.25 │ pop %r12
1.83 │ ← ret
│ nop
│ zend_hash_find_bucket():
0.26 │40: mov 0x18(%rbx),%rdi
0.04 │ test %rdi,%rdi
│ ↓ je 53
│ zend_string_equal_content():
0.01 │ mov 0x10(%rbp),%rax
0.01 │ cmp %rax,0x10(%rdi)
5.03 │ ↓ je 90
│ zend_hash_find_bucket():
1.06 │53: mov 0xc(%rbx),%ebx
0.11 │ cmp $0xffffffff,%ebx
0.15 │ ↓ je a0
0.33 │ shl $0x5,%rbx
0.24 │ add %r12,%rbx
1.90 │ cmp 0x18(%rbx),%rbp
2.69 │ ↑ je 32
2.00 │68: mov 0x8(%rbp),%rax
0.24 │ cmp %rax,0x10(%rbx)
Is this a known performance issue within the PHP community? I'm seeking suggestions or insights on potential avenues for optimization. Your feedback and suggestions would be greatly appreciated.
PHP Version
master
Operating System
No response
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia leggendo zend_hash_find_bucket e i relativi entry point zend_hash_find e zend_hash_find_known_hash, quindi riproduci il profilo perf segnalato con il carico di lavoro WordPress. Il lavoro è completo quando è disponibile una modifica motivata con un miglioramento misurabile in questo carico di lavoro, preservando al contempo il comportamento della ricerca hash.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- c, php
- Ambito
- backend, performance
- Tipo di issue
- Refactoring
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Da chiarire
- Idoneità per principianti
- 25/100