No estoy preocupado por el uso de RAM (ya que tengo suficiente) ni por la pérdida de datos en caso de un apagado accidental (ya que mi energía está respaldada, el sistema es confiable y los datos no son críticos). Pero hago mucho procesamiento de archivos y podría usar un aumento de rendimiento.
Es por eso que me gustaría configurar el sistema para que use más RAM para el almacenamiento en caché de lectura y escritura del sistema de archivos, para captar archivos agresivamente (por ejemplo, leer todo el archivo al que accede una aplicación en caso de que el archivo sea de un tamaño razonable o al menos leer de antemano una gran parte de lo contrario) y eliminar los buffers de escritura con menos frecuencia. ¿Cómo lograr esto (puede ser posible)?
Uso los sistemas de archivos ext3 y ntfs (¡uso mucho ntfs!) Con XUbuntu 11.10 x86.
sudo mount -o ro,nobarrier /path/to/mountpoint
o ajuste/etc/fstab
para incluirnobarrier
cualquier sistema de archivos que esté dispuesto a sacrificar para mejorar el rendimiento. Sin embargo, si su dispositivo de almacenamiento tiene una batería interna como la serie Intel 320 SSD, el usonobarrier
no causa pérdida de datos.Respuestas:
Mejorar el rendimiento de la memoria caché del disco en general es más que solo aumentar el tamaño de la memoria caché del sistema de archivos a menos que todo el sistema se ajuste a la RAM, en cuyo caso debe usar la unidad de RAM (
tmpfs
es bueno porque permite volver al disco si necesita la RAM en algún caso) para el almacenamiento en tiempo de ejecución (y quizás una secuencia de comandos initrd para copiar el sistema desde el almacenamiento a la unidad RAM al inicio).No dijiste si tu dispositivo de almacenamiento es SSD o HDD. Esto es lo que he encontrado que funciona para mí (en mi caso
sda
es un HDD montado en/home
ysdb
SSD montado en/
).Primero optimice la parte load-stuff-from-storage-to-cache:
Aquí está mi configuración para HDD (asegúrese de que AHCI + NCQ esté habilitado en BIOS si tiene conmutadores):
Vale la pena señalar que el caso de HDD es alto
fifo_expire_async
(generalmente de escritura) y largoslice_sync
para permitir que un solo proceso obtenga un alto rendimiento (configuradoslice_sync
en un número más bajo si encuentra situaciones en las que varios procesos esperan algunos datos del disco en paralelo). Elslice_idle
siempre es un compromiso para establecer unidades de disco duro, pero en algún lugar en el rango de 3-20 debería estar bien en función del uso del disco y firmware del disco. Prefiero apuntar a valores bajos, pero establecerlo demasiado bajo destruirá su rendimiento. Laquantum
configuración parece afectar mucho el rendimiento, pero trate de mantenerlo lo más bajo posible para mantener la latencia en un nivel razonable. Establecerquantum
demasiado bajo destruirá el rendimiento. Los valores en el rango 3-8 parecen funcionar bien con discos duros. La peor latencia de caso para una lectura es (quantum
*slice_sync
) + (slice_async_rq
*slice_async
) ms si he entendido el comportamiento del núcleo correctamente. El asíncrono es utilizado principalmente por las escrituras y, dado que está dispuesto a retrasar la escritura en el disco, configure ambasslice_async_rq
yslice_async
números muy bajos. Sin embargo, establecerslice_async_rq
un valor demasiado bajo puede detener las lecturas porque las escrituras ya no se pueden retrasar después de las lecturas. Mi configuración intentará escribir datos en el disco como máximo después de 10 segundos después de que los datos se han pasado al núcleo, pero ya que se puede tolerar la pérdida de datos sobre la pérdida de potencia también fijadosfifo_expire_async
a3600000
decir que 1 hora está bien por el retraso en el disco. Sinslice_async
embargo, solo mantenga el nivel bajo, porque de lo contrario puede obtener una latencia de lectura alta.El
hdparm
comando es necesario para evitar que AAM elimine gran parte del rendimiento que permite AHCI + NCQ. Si su disco hace demasiado ruido, omita esto.Aquí está mi configuración para SSD (serie Intel 320):
Aquí vale la pena señalar los valores bajos para diferentes configuraciones de corte. La configuración más importante para un SSD es la
slice_idle
que debe establecerse en 0-1. Establecerlo en cero mueve todas las decisiones de pedido a NCQ nativo, mientras que establecerlo en 1 permite que el núcleo ordene solicitudes (pero si el NCQ está activo, el hardware puede anular parcialmente el pedido del núcleo). Pruebe ambos valores para ver si puede ver la diferencia. Para la serie Intel 320, parece que el establecimientoslide_idle
de0
da el mejor rendimiento, pero poniéndolo a1
da mejor latencia global (la más baja).Para obtener más información sobre estos ajustables, consulte http://www.linux-mag.com/id/7572/ .
Ahora que hemos configurado el kernel para cargar cosas desde el disco a la memoria caché con un rendimiento razonable, es hora de ajustar el comportamiento de la memoria caché:
Según los puntos de referencia que he hecho, no me molestaría en configurar la lectura anticipada
blockdev
en absoluto. La configuración predeterminada del kernel está bien.Configure el sistema para que prefiera intercambiar datos de archivos sobre el código de la aplicación (esto no importa si tiene suficiente RAM para mantener todo el sistema de archivos y todo el código de la aplicación y toda la memoria virtual asignada por las aplicaciones en la RAM). Esto reduce la latencia para intercambiar entre diferentes aplicaciones sobre la latencia para acceder a archivos grandes desde una sola aplicación:
Si prefiere mantener las aplicaciones casi siempre en la RAM, puede configurar esto en 1. Si configura esto en cero, el núcleo no se intercambiará a menos que sea absolutamente necesario para evitar OOM. Si tenía memoria limitada y trabajaba con archivos grandes (p. Ej., Edición de video HD), entonces podría tener sentido establecer esto cerca de 100.
Hoy en día (2017) prefiero no tener ningún intercambio si tienes suficiente RAM. Al no tener intercambio, generalmente perderá 200-1000 MB de RAM en una máquina de escritorio de larga ejecución. Estoy dispuesto a sacrificar eso para evitar la latencia del peor de los casos (intercambiando el código de la aplicación cuando la RAM está llena). En la práctica, esto significa que prefiero OOM Killer a intercambiar. Si permite / necesita intercambiar, es posible que desee aumentar
/proc/sys/vm/watermark_scale_factor
también para evitar cierta latencia. Sugeriría valores entre 100 y 500. Puede considerar esta configuración como el uso de CPU comercial para una latencia de intercambio más baja. El valor predeterminado es 10 y el máximo posible es 1000. Un valor más alto debería (de acuerdo con la documentación del kernel ) dar como resultado un mayor uso de la CPU para loskswapd
procesos y una menor latencia de intercambio general.Luego, dígale al kernel que prefiera mantener la jerarquía de directorios en la memoria sobre el contenido del archivo en caso de que se necesite liberar algo de RAM (nuevamente, si todo encaja en la RAM, esta configuración no hace nada):
Ajuste
vfs_cache_pressure
un valor bajo tiene sentido porque en la mayoría de los casos, el núcleo necesita conocer la estructura del directorio antes de poder usar el contenido del archivo de la memoria caché y vaciar la memoria caché del directorio demasiado pronto hará que la memoria caché del archivo sea casi inútil. Considere ir a 1 con esta configuración si tiene muchos archivos pequeños (mi sistema tiene alrededor de 150,000 fotos de 10 megapíxeles y cuenta como un sistema de "muchos archivos pequeños"). Nunca lo ajuste a cero o la estructura del directorio siempre se mantiene en la memoria, incluso si el sistema se está quedando sin memoria. Establecer esto en gran valor es sensato solo si tiene solo unos pocos archivos grandes que se vuelven a leer constantemente (nuevamente, la edición de video HD sin suficiente RAM sería un ejemplo). La documentación oficial del kernel dice que "Excepción: si tiene una cantidad realmente masiva de archivos y directorios y rara vez toca / lee / enumera todos los archivos con una configuración
vfs_cache_pressure
superior a 100, puede ser sabio. Esto solo se aplica si no tiene suficiente RAM y no puede mantener toda la estructura de directorios en RAM y aún tiene suficiente RAM para la caché de archivos y procesos normales (por ejemplo, servidor de archivos de toda la empresa con mucho contenido de archivo). Si siente que necesita aumentar porvfs_cache_pressure
encima de 100, está ejecutando sin suficiente RAM. El aumentovfs_cache_pressure
puede ayudar, pero la única solución real es obtener más RAM. Habiendovfs_cache_pressure
establecido en alto número sacrifica el rendimiento promedio para tener un rendimiento más estable en general (es decir, se puede evitar muy mal comportamiento peor caso, pero tener que lidiar con un peor rendimiento global).Finalmente, dígale al núcleo que use hasta el 99% de la RAM como caché para las escrituras e indique al núcleo que use hasta el 50% de la RAM antes de ralentizar el proceso que está escribiendo (el valor predeterminado
dirty_background_ratio
es10
). Advertencia: Yo personalmente no haría esto, pero usted afirmó tener suficiente RAM y está dispuesto a perder los datos.Y diga que 1h de retraso de escritura está bien incluso para comenzar a escribir cosas en el disco (de nuevo, no haría esto):
Si coloca todo eso
/etc/rc.local
e incluye el siguiente al final, todo estará en caché lo antes posible después del arranque (solo haga esto si su sistema de archivos realmente cabe en la RAM):O una alternativa un poco más simple que podría funcionar mejor (solo caché
/home
y/usr
, solo haga esto si su/home
y/usr
realmente encaja en RAM):fuente
En primer lugar, NO le recomiendo que continúe usando NTFS, ya que la implementación de NTFS en Linux sería un problema de rendimiento y seguridad en cualquier momento.
Hay varias cosas que puedes hacer:
ext4
obtrfs
bfq
preload
systemd
precargar mientras arrancaQuizás quieras probarlo :-)
fuente
btrfs
es un sistema de archivos recientemente diseñado, lo evitaría si se necesita rendimiento. Hemos estado ejecutando sistemasbtrfs
yext4
sistemas de archivos idénticos yext4
ganamos en el mundo real con un gran margen (btrfs
parece requerir aproximadamente 4 veces más tiempo de CPU que lasext4
necesidades para el mismo nivel de rendimiento y provoca más operaciones de disco para un solo comando lógico). Dependiendo de la carga de trabajo, sugeriríaext4
,jfs
oxfs
para cualquier trabajo que requiera rendimiento.Leer por adelantado:
En sistemas de 32 bits:
En sistemas de 64 bits:
Escribe detrás del caché:
Esto usará hasta el 100% de su memoria libre como caché de escritura.
O puede salir y usar tmpfs. Esto solo es relevante si tiene suficiente RAM. Pon esto en
/etc/fstab
. Reemplace 100G con la cantidad de RAM física.Entonces:
Luego use / mnt / tmpfs.
fuente
Puede establecer el tamaño de lectura anticipada con
blockdev --setra sectors /dev/sda1
, donde sectores es el tamaño que desea en sectores de 512 bytes.fuente
Mi configuración asesina es muy simple y muy efectiva:
La explicación de la documentación del kernel :
vfs_cache_pressure
en 2000 hace que la mayor parte de la computación ocurra en la RAM y las escrituras de disco muy tardías.fuente
vfs_cache_pressure
demasiado alto (lo consideraría2000
demasiado alto) provocará un acceso innecesario al disco, incluso para cosas simples como listas de directorios que deberían caber fácilmente en la memoria caché. ¿Cuánta RAM tiene y qué está haciendo con el sistema? Como escribí en mi respuesta, usar un valor alto para esta configuración tiene sentido, por ejemplo, para la edición de video HD con RAM limitada.No está relacionado con el almacenamiento en caché de escritura, pero está relacionado con las escrituras:
Para un sistema ext4, puede deshabilitar el diario por completo
Esto reducirá el número de escrituras de disco para cualquier actualización en particular, pero puede dejar que el sistema de archivos tenga un estado inconsistente después de un apagado inesperado, que requiera un fsck o algo peor.
Para evitar que las lecturas de disco activen escrituras de disco:
Montar con el relatime o la noatime opción
Cuando lee un archivo, los metadatos del "último tiempo de acceso" para ese archivo generalmente se actualizan. La
noatime
opción deshabilitará ese comportamiento. Esto reduce las escrituras de disco innecesarias, pero ya no tendrá esos metadatos. Algunas distribuciones (por ejemplo, Manjaro) han adoptado esto como el valor predeterminado en todas las particiones (probablemente para aumentar la vida útil de los SSD de modelos anteriores).relatime
actualiza el tiempo de acceso con menos frecuencia, de acuerdo con las heurísticas que ayudan a admitir aplicaciones que utilizan el atime. Este es el valor predeterminado en Red Hat Enterprise Linux.Otras opciones:
fuente