Perché gli aggiornamenti semplici a "_edit_lock" in wp_postmeta sono così lenti?
Nel nostro log delle query lente di MySQL, la query cumulativamente più lenta è un semplice aggiornamento a wp_postmeta. Ecco un esempio:
UPDATE `wp_postmeta`
SET `meta_value` = '1392835505:386'
WHERE `post_id` = 94705 AND `meta_key` = '_edit_lock';
Dettagli rilevanti sulla nostra configurazione:
- Tempo di query lenta MySQL impostato a 1s
- Il motore di storage di wp_postmeta è InnoDB
- In esecuzione in una grande installazione Multisite con decine di migliaia di post sul blog principale WP (dove si verificano queste query lente)
- Alta attività nell'area admin di WP (molti scrittori/editori che lavorano in contemporanea, ma generalmente sul proprio contenuto, non su quello altrui)
- Bassa attività sul lato pubblico di WP (non si sta effettivamente servendo contenuto dal blog principale)
- Le query lente sembrano tutte utilizzare la chiave "_edit_lock"; query dello stesso formato (che usano una chiave diversa da "_edit_lock") non sembrano essere lente.
Perché questa è la query più lenta sul nostro sistema? Ha qualcosa a che fare con l'uso specifico che WP fa dei "blocchi di modifica"?
Grazie! :)
Aggiornamento: Output da mysqlsla qui sotto:
______________________________________________________________________ 001 ___
Count : 606 (16.83%)
Time : 2257.760468 s total, 3.725677 s avg, 1.00512 s to 84.645869 s max (20.60%)
95% of Time : 1355.289277 s total, 2.357025 s avg, 1.00512 s to 12.343604 s max
Lock Time (s) : 182.502 ms total, 301 μs avg, 29 μs to 157.542 ms max (0.21%)
95% of Lock : 22.882 ms total, 40 μs avg, 29 μs to 57 μs max
Rows sent : 0 avg, 0 to 0 max (0.00%)
Rows examined : 1 avg, 1 to 2 max (0.00%)
Database : xxx_wp
Users :
xxx_wp@localhost : 98.84% (599) of query, 51.03% (1837) of all users
yyy_wp@localhost : 1.16% (7) of query, 0.94% (34) of all users
Query abstract:
SET timestamp=N; UPDATE wp_postmeta SET meta_value = 'S' WHERE post_id = N AND meta_key = 'S';
Query sample:
SET timestamp=1392835506;
UPDATE `wp_postmeta` SET `meta_value` = '1392835505:386' WHERE `post_id` = 94705 AND `meta_key` = '_edit_lock';
il _edit_lock viene generato ogni volta che modifichi un articolo o una pagina. Contiene il timestamp e l'utente, in modo che WordPress sappia chi lo sta modificando attualmente.
meta_id post_id meta_key meta_value
9 5 _edit_lock 1388386997:1
Se lo manipoli, WordPress reagisce in modo piuttosto sensibile... Ho provato a calcolare per quanti secondi qualcuno ha lavorato su un articolo. Ogni volta ha rallentato il caricamento del mio database.
Come hai detto, stai gestendo un multisite di grandi dimensioni. Non so quanti utenti scrivono articoli lì, ma potrebbe sicuramente saturare la RAM del server se troppe persone modificano un articolo contemporaneamente.
Una soluzione potrebbe essere: eliminare _edit_lock
Come disabilitare il "Post Lock/Edit Lock"?
Normalmente WordPress dovrebbe avere un solo "_edit_lock" per articolo. Alcuni database hanno il problema di generarli ogni volta.
Come questo utente http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta
La sua soluzione è stata eliminarli tutti. Per velocizzare puoi eliminarli tutti ogni notte alle 3 del mattino in phpMyAdmin con
DELETE FROM `yourdb`.`wp_postmeta` WHERE `wp_postmeta`.`meta_key` = '_edit_lock'
potresti trovare un cron job che faccia esattamente questo.
