Perché gli aggiornamenti semplici a "_edit_lock" in wp_postmeta sono così lenti?

21 feb 2014, 19:04:04
Visualizzazioni: 19.4K
Voti: 13

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';
10
Commenti

Quanti risultati ottieni con SELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'; ?

adrian7 adrian7
22 feb 2014 13:27:33

Grazie per la tua domanda, adrian7! Ci sono 33k righe che corrispondono alla tua query. Non sono familiare con l'utilizzo da parte di WP della meta key '_edit_lock'. È anormale?

rinogo rinogo
24 feb 2014 20:09:54

Non è anormale, WordPress la utilizza per avvisare gli utenti quando stanno cercando di modificare lo stesso post/pagina. Ti suggerisco di eliminare tutti i _edit_lock dalla tabella wp_postmeta, ovviamente quando nessuno sta modificando, e verificare eventuali miglioramenti nelle prestazioni. (Tra l'altro, fai prima un backup).

adrian7 adrian7
25 feb 2014 14:13:34

Richiede anche un'enorme quantità di tempo quando fai semplicemente un SELECT di questa voce? Tipo SELECT * FROMwp_postmetaWHEREpost_id= 94705 ANDmeta_key= '_edit_lock';?

fischi fischi
5 mar 2014 02:17:51

@fischi: Sembra che quella query richieda dai 45-50ms, almeno nei test che ho appena fatto qualche istante fa. Tuttavia, è possibile che occasionalmente possa richiedere molto tempo (ad esempio fino a 84 secondi, come mostrato nell'output di mysqlsla incluso nella domanda). Eseguirò una nuova analisi delle query lente per vedere se alcune delle recenti modifiche alla nostra configurazione hanno influenzato le query.

rinogo rinogo
13 mar 2014 20:52:48

Sembra che stiamo ancora ottenendo query lente di questo tipo... La cosa più strana è che il nostro server nel complesso è relativamente inattivo. Siamo su un VPS con 8 CPU con un carico attuale di 0.27 0.51 0.66 e un tasso di hit della cache InnoDB costantemente al 100%. Penso che molti di noi concorderebbero che probabilmente non si tratta di un problema con l'SQL effettivo generato da Wordpress, ma piuttosto con l'architettura sottostante e come si traduce nel database (MySQL). Sembra che ci sia qualcosa di strano qui che è più profondo della semplice ottimizzazione delle query SQL e simili...

rinogo rinogo
13 mar 2014 21:28:08

http://bugs.mysql.com/bug.php?id=28382 potrebbe essere correlato. Ridurre la cache delle query potrebbe aiutare.

fuxia fuxia
14 mar 2014 04:22:00

Hmm... Potrebbe essere. Quel bug è un duplicato di http://bugs.mysql.com/bug.php?id=21074, che sembra essere stato risolto e incluso nella versione 5.1.23. Noi stiamo utilizzando la 5.1.73. :/ Comunque, vale comunque la pena provare - suppongo che posso sperimentare con diverse dimensioni di cache/buffer per vedere se c'è una connessione evidente. In ogni caso, questo problema certamente non sta bloccando il nostro sistema; è più una bandiera gialla. Forse il fatto che questo emerga è dovuto alla nostra abbondanza di risorse e all'entusiasmo nella caccia e eliminazione delle query lente...? Tuttavia, c'è sicuramente qualcosa di strano che sta accadendo.

rinogo rinogo
14 mar 2014 06:04:56

(ovvero, forse, come suggerisci, il fatto di allocare più risorse al problema è ESSO STESSO la fonte del problema...)

rinogo rinogo
14 mar 2014 06:05:58

Prima di tutto è necessario verificare le configurazioni del server per prestazioni e utilizzo ottimale. WordPress con questa grande quantità di dati e strutture sarà intrinsecamente molto lento. A volte potresti riscontrare un crash di MySQL o altri problemi lato server. Se gestisci un utente alla volta sul tuo server e pagina, questo creerà un'esecuzione più rapida. Il problema è lato server, non in WordPress. Sposta il tuo MySQL su un altro VPS e la pagina su un altro ancora, utilizza servizi cloud, dischi SSD sul server, aumenta la RAM del server. Solo allora potrai testare oggettivamente le richieste delle query.

Foxsk8 Foxsk8
14 mar 2014 23:47:36
Mostra i restanti 5 commenti
Tutte le risposte alla domanda 3
0

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.

2 apr 2014 04:25:45
0

prova questo :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
3 set 2019 18:09:49
0

Probabilmente il modo più semplice è utilizzare il metodo di WordPress.

update_post_meta($post_id, '_edit_lock', time().':'.$user_id);

23 apr 2020 10:53:11