¿Hay alguna manera de limitar el tamaño del caché del búfer en Linux?

¿Hay alguna manera de limitar el tamaño del caché del búfer en Linux?

Tengo un programa que consume mucha memoria durante las operaciones de E/S, lo cual es un efecto secundario de realizar muchas de ellas. Cuando ejecuto el programa usando direct_io, el problema de memoria desaparece, pero el tiempo que tarda el programa en finalizar el trabajo es cuatro veces mayor.

¿Hay alguna forma de reducir el tamaño máximo del caché del búfer (búfer del kernel utilizado durante las operaciones de E/S)? Preferiblemente sin cambiar las fuentes del kernel.

Intenté reducir /proc/sys/vm/dirty_bytes, etc. Pero eso no parece hacer ninguna diferencia notable.

ACTUALIZACIÓN: el uso echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches durante la ejecución del programa reduce temporalmente la cantidad de memoria utilizada.

¿Puedo limitar de alguna manera el caché de página, los dentries y los inodos en lugar de liberarlos constantemente? Probablemente eso resolvería mi problema.

No lo había notado antes, pero el problema ocurre con cada operación de E/S, no solo con la partición. Parece que Linux está almacenando en caché todo lo que pasa por E/S hasta cierto punto en el que alcanza casi el máximo de memoria disponible, dejando 4 MB de memoria libre. Por lo tanto, existe una especie de límite superior sobre la cantidad de memoria que se puede almacenar en caché para E/S. Pero no puedo encontrar dónde está. Poniéndose un poco desesperado. Si no puedo dividirlo por 2 en algún lugar de las fuentes del kernel, lo haré con mucho gusto.

Actualización del 12/12/2016: Dejé de intentar solucionarlo, pero algo me llamó la atención y me recordó este problema. Tengo un disco duro antiguo que falla en casa y desperdicia recursos como loco cuando intento hacer algo con él.

¿Es posible que ese sea el caso de que simplemente el disco duro falle? El disco duro en cuestión murió un mes después de que ocurrió mi problema. Si este es el caso, tengo mi respuesta.

Respuesta1

Como preguntas sobreprograma, podrías usargrupos c:

Cree un cgroup llamado grupo1 con un límite de memoria (de 50 GB, por ejemplo, se admiten otros límites como CPU, en el ejemplo también se menciona CPU):

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

Luego, si su aplicación ya se está ejecutando, inclúyala en este cgroup:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

O ejecute su aplicación dentro de este cgroup:

cgexec -g memory,cpu:group1 your_app_name

información relacionada