1 votos

¿Forzar a `kernel_task` a intercambiar memoria?

He tenido un proceso de compresión de una semana en un MacBook. Cuando llegó al 95%, la velocidad de repente cayó al 5% de uso de CPU. Rastreando el problema, encontré que kernel_task está ocupando 6.87GB, dejando aproximadamente 1GB para los otros procesos. Esto provoca una sobrecarga en el proceso de compresión. Siguiendo el problema más a fondo, descubrí que un proceso de bash está usando ¡casi 1TB (!) de memoria del kernel. ¡Esto es ligeramente más que el espacio libre en mi disco duro! No tengo ni idea de lo que está haciendo, ningún otro proceso parece tenerlo como padre.

Cerré todas las ventanas de bash, pero el proceso permaneció. Ejecuté kill en él, sin diferencia. Finalmente lo terminé usando kill -9.

En ¿Por qué la memoria filtrada aparece asignada dinámicamente a kernel_task y por qué macOS no puede recogerla como basura, matar Preview resolvió este problema, pero en mi caso, el uso de memoria de kernel_task permaneció. Tal vez debido a cómo fue asesinado. Intenté ejecutar sync y purge, sin diferencia. La recolección de basura no se aplica a kernel_task. ¿Hay algo más que podría hacer para recuperar esta memoria? Teóricamente, si pudiera mover al menos la memoria inactiva a swap, entonces el proceso de compresión tendría suficiente para completar rápidamente lo que está haciendo.

No parece que las extensiones de kernel estén usando una cantidad anormal de memoria, no están instaladas extensiones de terceros.

2voto

Oskar Puntos 1242

Es poco probable que logres avanzar con esto. Todos los mecanismos que podrías utilizar para cambiar el sistema requieren un reinicio, salvo uno.

Si puedes pausar la tarea de compresión y estás utilizando bash/ksh/zsh, podrías desvincular el proceso para poder salir de la sesión gráfica, finalizar el proceso del terminal que originó tu shell. Toda la memoria utilizada por bash y todo lo demás que iniciaste al ingresar se liberará. No se llevará a cabo la recolección de basura, pero es lo mejor que puedes hacer una vez que inicias la compresión.

  1. Ctrl+Z para detener (pausar) el programa y volver al shell.
  2. bg para ejecutarlo en segundo plano.
  3. disown -h [job-spec] donde [job-spec] es el número de trabajo (como %1 para el primer trabajo en ejecución; descubre tu número con el comando jobs) para que el trabajo no sea eliminado cuando se cierre el terminal.

En el futuro, puedes iniciar estas tareas de larga duración con tmux o screen o nohup para poder luego cerrar la sesión gráfica y dedicar el 100% de los recursos a ese proceso y sus hijos. Resolver las fugas de memoria no es realmente compatible con las correcciones en caliente, ya que debes cambiar las cosas que haces después de reiniciar y/o parchear el sistema y las aplicaciones que están liberando memoria.


En la próxima ejecución, yo me conectaría por ssh al Mac desde otro dispositivo (teléfono, iPad, otro ordenador) y ejecutaría la compresión bajo screen y vigilaría las fugas y otros problemas. Si todo está limpio, podrías entonces conectarte gráficamente y tratar de minimizar las fugas si necesitas utilizar el hardware para otras tareas y luego cerrar la sesión tan pronto como hayas terminado.

En mi experiencia, deshabilitar el intercambio o hacer ajustes no te ayudará a superar la mala codificación y las fugas, pero por favor informa si encuentras una solución. Tienes muchos más detalles sobre lo que estás haciendo que nosotros, quizás haya algo que puedas hacer.

1voto

aristo Puntos 126

La respuesta de bmike es simplemente genial, y enumera cosas que puedes hacer con un proceso general. Me gustaría agregar algo específico a este proceso, a saber, la compresión.

La idea es terminar la compresión donde está, para que después de cerrar la sesión y volver a iniciarla, puedas continuar el proceso para agregar más archivos.

Una cosa que NO debes intentar es mover los archivos que no han sido comprimidos. En mi caso, dejé el directorio que estaba comprimiendo, pero moví los archivos de todos los demás directorios, esperando que viera los directorios vacíos, los comprimiera y terminara. Pero al parecer la lista de archivos actual se compiló cuando comenzó la compresión. Así que después de terminar el directorio actual, el sistema arrojó un error de File not found para todos los archivos restantes, y después de terminar toda la lista, salió con un error de System error: E_FAIL. En otras palabras, no quedó ningún archivo de archivo comprimido, y toda la semana de compresión se perdió.

Una forma de terminar la compresión donde está es crear un directorio paralelo en la misma unidad, y crear un archivo vacío para cada uno de los archivos restantes, a través de touch. Luego, intercambiar los dos directorios en un solo comando. Cuando se produce el intercambio, el archivo que comenzó a comprimirse ya está abierto, por lo que terminará aunque ahora esté en un directorio diferente. De esta manera, no se generarán mensajes de error de File not found durante los pocos milisegundos en que se produce el intercambio. Y cuando este archivo haya terminado, los archivos restantes que leerá estarán vacíos, por lo que se comprimirán casi instantáneamente, permitiendo así que el proceso de compresión termine creando de todos modos un archivo de archivo. Después de cerrar la sesión y volver a iniciarla, este archivo se puede actualizar fácilmente con los archivos correctos.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X