¿Por qué las actualizaciones simples de "_edit_lock" en wp_postmeta son tan lentas?

21 feb 2014, 19:04:04
Vistas: 19.4K
Votos: 13

En nuestro registro de consultas lentas de MySQL, la consulta acumulativamente más lenta es una simple actualización a wp_postmeta. Aquí un ejemplo:

UPDATE `wp_postmeta`
  SET `meta_value` = '1392835505:386'
  WHERE `post_id` = 94705 AND `meta_key` = '_edit_lock';

Detalles relevantes de nuestra configuración:

  • Tiempo de consulta lenta de MySQL configurado a 1s
  • El motor de almacenamiento de wp_postmeta es InnoDB
  • Ejecutándose en una instalación Multisite grande con decenas de miles de posts en el blog principal de WP (donde ocurren estas consultas lentas)
  • Alta actividad en el área de administración de WP (muchos escritores/editores trabajando concurrentemente, pero generalmente en su propio contenido, no en el de otros)
  • Baja actividad en la parte pública de WP (no se sirve contenido del blog principal)
  • Las consultas lentas parecen usar siempre la clave "_edit_lock"; consultas del mismo formato (que usan una clave diferente a "_edit_lock") no parecen ser lentas.

¿Por qué esta es la consulta más lenta en nuestro sistema? ¿Tiene que ver con el uso específico que hace WP de los "bloqueos de edición"?

¡Gracias! :)


Actualización: Salida de mysqlsla a continuación:

______________________________________________________________________ 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
Comentarios

¿Cuántos resultados obtienes al ejecutar SELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'; ?

adrian7 adrian7
22 feb 2014 13:27:33

¡Gracias por tu pregunta, adrian7! Hay 33k filas que coinciden con tu consulta. No estoy familiarizado con el uso que hace WP de la meta clave '_edit_lock'. ¿Esto es anormal?

rinogo rinogo
24 feb 2014 20:09:54

No es anormal, WordPress lo utiliza para alertar a los usuarios cuando intentan editar la misma entrada/página. Te sugiero que elimines todos los _edit_lock de wp_postmeta, obviamente cuando nadie esté editando, y verifiques si hay mejoras en el rendimiento. (Por cierto, haz una copia de seguridad primero).

adrian7 adrian7
25 feb 2014 14:13:34

¿También toma una enorme cantidad de tiempo cuando simplemente haces un SELECT de esta entrada? Como SELECT * FROMwp_postmetaWHEREpost_id= 94705 ANDmeta_key= '_edit_lock';?

fischi fischi
5 mar 2014 02:17:51

@fischi: Esa consulta parece tomar entre 45-50ms, al menos en las pruebas que acabo de hacer hace unos momentos. Sin embargo, es posible que ocasionalmente tome mucho tiempo (por ejemplo, hasta 84 segundos, como se muestra en la salida de mysqlsla incluida en la pregunta). Voy a ejecutar una nueva ronda de análisis de consultas lentas para ver si alguno de mis cambios recientes en nuestra configuración ha afectado las consultas.

rinogo rinogo
13 mar 2014 20:52:48

Parece que todavía estamos obteniendo consultas lentas de este tipo... Lo más extraño es que nuestro servidor en general está relativamente inactivo. Estamos en un VPS de 8 CPUs con una carga actual de 0.27 0.51 0.66 y una tasa de acierto constante del caché InnoDB del 100%. Creo que la mayoría estaría de acuerdo en que esto probablemente no sea un problema con el SQL real generado por Wordpress, sino más bien con la arquitectura subyacente y cómo se traduce a la base de datos (MySQL). Parece que hay algo extraño sucediendo aquí que es más profundo que solo la optimización de consultas SQL y similares...

rinogo rinogo
13 mar 2014 21:28:08

http://bugs.mysql.com/bug.php?id=28382 podría estar relacionado. Reducir la caché de consultas podría ayudar.

fuxia fuxia
14 mar 2014 04:22:00

Hmm... Podría ser. Ese error es un duplicado de http://bugs.mysql.com/bug.php?id=21074, que parece estar cerrado e incluido en la versión 5.1.23. Nosotros estamos ejecutando la 5.1.73. :/ De cualquier manera, vale la pena intentarlo - supongo que puedo experimentar con diferentes tamaños de caché/búfer para ver si hay una conexión aparente. De cualquier forma, este problema ciertamente no está paralizando nuestro sistema; es más una bandera amarilla. ¿Quizás el hecho de que esto esté surgiendo se deba a nuestra sobreabundancia de recursos y entusiasmo por la caza y eliminación de consultas lentas...? Aún así, definitivamente hay algo raro ocurriendo.

rinogo rinogo
14 mar 2014 06:04:56

(o sea, quizás, como sugieres, asignar más recursos al problema ES la fuente del problema en sí mismo...)

rinogo rinogo
14 mar 2014 06:05:58

Primero que todo, necesitas verificar las configuraciones de tu servidor para obtener el mejor rendimiento y uso. WordPress con esta cantidad de datos y estructura será muy lento por sí mismo. A veces puedes tener un fallo en MySQL u otros problemas del servidor. Si haces que una persona acceda a la vez a tu servidor o página, esto creará un trabajo rápido. El problema está en el lado del servidor, no en WordPress. Coloca tu MySQL en otro VPS y la página en otro, utiliza servicios en la nube, discos SSD en el servidor, añade más memoria RAM al servidor. Entonces podrás hacer pruebas objetivas de las consultas.

Foxsk8 Foxsk8
14 mar 2014 23:47:36
Mostrar los 5 comentarios restantes
Todas las respuestas a la pregunta 3
0

El _edit_lock se genera cada vez que editas una publicación o página. Consiste en una marca de tiempo y el usuario, así WordPress sabe quién lo está editando actualmente.

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

Si lo manipulas, WordPress reacciona de manera sensible... Intenté calcular cuántos segundos alguien trabajó en una publicación. Todo el tiempo rompió el tiempo de carga de mi base de datos.

Como dijiste que ejecutas esto en una red multisitio grande. No sé cuántos usuarios escriben publicaciones allí, pero definitivamente podría saturar la RAM del servidor si demasiadas personas editan una publicación al mismo tiempo.

Una solución podría ser: eliminar _edit_lock

Cómo deshabilitar el "Bloqueo de publicación/Bloqueo de edición"

Normalmente WordPress debería tener un "_edit_lock" por publicación. Algunas bases de datos tienen el problema de generarlos cada vez.

Como este caso http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta

Su solución fue eliminarlos todos. Para acelerarlo puedes eliminarlos todas las noches a las 3 en punto en phpMyAdmin con

DELETE FROM `yourdb`.`wp_postmeta` WHERE `wp_postmeta`.`meta_key` = '_edit_lock'

Quizás encuentres un trabajo cron que haga exactamente eso.

2 abr 2014 04:25:45
0

prueba esto :)

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

Probablemente, la forma más sencilla es usar el método de WP.

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

23 abr 2020 10:53:11