De alguna manera, cambié 14 GB de memoria. Después de haber matado al culpable, tengo toneladas de memoria libre nuevamente, así que pensé que podría traer los datos importantes nuevamente. Entonces, con 5 GB de 32 GB utilizados y 14 GB de espacio de intercambio utilizado, corrí swapoff -a
... y 4 horas más tarde, aproximadamente la mitad del trabajo estaba terminado.
Esto significa menos de 1 MB / s, mientras que puedo copiar fácilmente 200 MB / s. Mi intercambio está encriptado, pero también lo están todas las particiones normales y con aes-ni no conduce a una carga notable de CPU (y llenar el espacio de intercambio tomó solo unos minutos). Veo que no hay una razón especial para optimizar swapoff
, sin embargo, me pregunto cómo podría ser tan lento.
Solo agrego algunos datos más: mi memoria principal es de 32 GB y tengo espacio de intercambio de 32 GB en cada uno de los 4 discos duros (seguramente una exageración, pero ¿a quién le importa?). Todo el espacio de intercambio se puede (descifrar y) leer en menos de 5 minutos:
time -p sudo sh -c 'for i in /dev/mapper/cryptswap?; do md5sum $i & done; wait'
014a2b7ef300e11094134785e1d882af /dev/mapper/cryptswap1
a6d8ef09203c1d8d459109ff93b6627c /dev/mapper/cryptswap4
05aff81f8d276ddf07cf26619726a405 /dev/mapper/cryptswap3
e7f606449327b9a016e88d46049c0c9a /dev/mapper/cryptswap2
real 264.27
Leer una parte de una partición no puede ser más lento que leerlo todo. Sin embargo, leer alrededor de 1/10 toma alrededor de 100 veces más.
Observé que durante swapoff
la CPU la mayoría estaba inactiva (quizás el 10% de un núcleo) y también los discos ("medidos" por los LED). También vi que los espacios de intercambio se desactivaron uno tras otro.
iostat -d 5
mostró bajo IO en los discos duranteswapoff
?Respuestas:
Primero, echemos un vistazo a lo que puede esperar de su disco duro. Su disco duro puede hacer 200 MB / s secuencialmente . Cuando factoriza tiempos de búsqueda, puede ser mucho más lento. Para elegir un ejemplo arbitrario, eche un vistazo a las especificaciones de uno de los discos modernos de 3 TB de Seagate, el ST3000DM001 :
Velocidad de datos máxima sostenida: 210 MB / s
Buscar lectura promedio: <8,5 ms
Bytes por sector: 4,096
Si nunca necesita buscar, y si su intercambio está cerca del borde del disco, puede esperar ver hasta la velocidad máxima = 210 MB / s
Pero si sus datos de intercambio están completamente fragmentados, en el peor de los casos, necesitaría buscar por cada sector que lea. Eso significa que solo puede leer 4 KB cada 8,5 ms, o 4 KB / 0.0085 = 470 KB / s
Así que de inmediato, no es inconcebible que de hecho estés corriendo contra la velocidad del disco duro.
Dicho esto, parece una tontería que
swapoff
se ejecute tan lentamente y tenga que leer las páginas fuera de orden, especialmente si se escribieron rápidamente (lo que implica un orden). Pero esa puede ser la forma en que funciona el núcleo. El informe de error de Ubuntu # 486666 discute el mismo problema:Una de las respuestas fue:
El informe de error se cerró sin resolver.
El libro de Mel Gorman " Comprender el administrador de memoria virtual de Linux " está un poco desactualizado, pero está de acuerdo en que esta es una operación lenta:
Hay un poco más de discusión desde 2007 sobre la lista de correo del kernel de Linux con el tema " acelerar el intercambio ", aunque las velocidades que están discutiendo allí son un poco más altas de lo que está viendo.
Es una pregunta interesante que probablemente generalmente se ignora, ya
swapoff
que rara vez se usa. Creo que si realmente quería seguir hacia abajo, el primer paso sería tratar de ver sus patrones de uso de disco con más cuidado (tal vez conatop
,iostat
o incluso las herramientas más potentes comoperf
osystemtap
). Lo que debe buscar puede ser una búsqueda excesiva, pequeñas operaciones de E / S, reescritura constante y movimiento de datos, etc.fuente
He estado experimentando el mismo problema con mi computadora portátil que tiene un SSD, por lo que buscar tiempos no debería ser un problema.
Encontré una explicación alternativa . Aquí hay un extracto
Por lo tanto, es un problema de kernel en lugar de cualquier otra cosa.
fuente
swapoff
se implementa. Cuando se intercambian las salidas del proceso, no toma mucho tiempo.strace swapoff
prácticamente todo lo que hace es llamar a la llamada alswapoff
sistema.Sí, el
swapoff
mecanismo es terriblemente ineficiente. La solución es fácil: iterar sobre procesos, en lugar de iterar sobre las páginas intercambiadas. Utilice este script de Python (no estoy afiliado):Tenga en cuenta que el modo de operación daemon es solo para computadoras de escritorio / portátiles que a menudo se hibernan. No lo ejecutaría como un demonio en un sistema de servidor; solo ejecútelo en primer plano, espere hasta que informe que se encargó de algunos procesos, luego deténgalo e intente:
Dado que la mayoría de las páginas ahora están presentes tanto en intercambio como en memoria,
swapoff
tiene muy poco que hacer y ahora debería ser increíblemente rápido (vi cientos de MB / s).Sección de historia por delante
El script python mencionado anteriormente se basa en el resto de esta respuesta, que a su vez fue mi mejora de esta respuesta anterior creada por jlong . Como el guión es mucho más seguro, recomiendo probar solo el resto de mi respuesta como la última línea de defensa :
Esto va quizás a 2 segundos y en realidad no hacer nada, sólo una lista de los 10 segmentos de memoria superior (en realidad se imprime más de una sola línea; sí, yo no amo de una sola línea, simplemente examinar los comandos, aceptar el riesgo, copiar y pegar en su caparazón; estos en realidad leerán de intercambio).
El one-liner principal es seguro (para mí), excepto que lee mucho / proc.
Los subcomandos preparados para su examen manual no son seguros . Cada comando colgará un proceso mientras dure el intercambio de un segmento de memoria. Por lo tanto, no es seguro con procesos que no toleran ninguna pausa. Las velocidades de transferencia que vi fueron del orden de 1 gigabyte por minuto. (El script Python mencionado anteriormente eliminó esa deficiencia).
Otro peligro es poner demasiada presión de memoria en el sistema, así que verifique con lo habitual
free -m
¿Qué hace?
El resultado de este script perl es una serie de
gdb
comandosdump memory (range)
que recuperan páginas intercambiadas a la memoria.La salida comienza con el tamaño, por lo que es bastante fácil pasarlo
| sort -Vr | head
para obtener los 10 segmentos más grandes por tamaño (SSIZE). Los-V
soportes para la clasificación version-number-adecuado, pero funciona para mi propósito. No pude entender cómo hacer que la ordenación numérica funcione.fuente
sort -t = -k 2n
/proc/$pid/mem
, buscar y leer directamente. Aquí está PoC basado en gran medida en su fragmento: gist.github.com/WGH-/91260f6d65db88be2c847053c49be5ae Este proceso no se detiene, AFAIK no debería haber ningún peligro causado por esto.Durante el intercambio, si se detecta una ranura de intercambio en uso, el núcleo primero se intercambia en la página. La función unuse_process () intenta encontrar todas las entradas de la tabla de páginas que corresponden a la página recién intercambiada y realiza la actualización necesaria de las tablas de páginas. La búsqueda es exhaustiva y requiere mucho tiempo: visita cada descriptor de memoria (de todo el sistema) y examina las entradas de la tabla de páginas una por una.
Consulte la página 724 de "Comprensión de la tercera versión del kernel de Linux".
fuente