Existe uma maneira de limitar o tamanho do cache de buffer no linux?

-1

Eu tenho programa consumindo muita memória durante as operações de E / S, o que é um efeito colateral de realizar cargas deles. Quando executo o programa usando direct_io, o problema de memória desaparece, mas o tempo necessário para que o programa termine o trabalho é quatro vezes maior.

Existe alguma maneira de reduzir o tamanho máximo do cache de buffer (buffer do kernel usado durante operações de E / S)? De preferência, sem alterar as fontes do kernel.

Eu tentei reduzir /proc/sys/vm/ dirty_bytes etc. Mas isso não parece estar fazendo nenhuma diferença perceptível.

ATUALIZAÇÃO: usando echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches Durante o tempo de execução do programa, reduz temporariamente a quantidade de memória usada.

Posso de alguma forma limitar pagecache, dentries e inodes em vez de constantemente liberá-los? Isso provavelmente resolveria meu problema.

Não percebi isso antes, mas o problema ocorre com cada operação de E / S, não apenas com o particionamento. Parece que o Linux está armazenando tudo o que passa pela E / S até um certo ponto quando ele atinge quase a memória máxima disponível, deixando 4 MB de memória livre. Portanto, há algum tipo de limite superior para a quantidade de memória armazenada em cache para E / S. Mas não consigo descobrir onde está. Ficando tipo desesperado. Se eu não puder dividir por 2 em algum lugar nas fontes do kernel, eu farei isso com prazer.

Atualização 12-12-2016: Eu desisti de consertar isso, mas algo me chamou a atenção e me lembrou desse problema. Eu tenho disco rígido antigo em casa e desperdiço recursos como um louco quando tento fazer algo com ele.

É possível que seja o caso de apenas falhar no HDD? HDD em questão, morreu dentro de um mês a partir de quando o meu problema ocorreu. Se este for o caso, recebo minha resposta.

    
por Eggplant 13.06.2016 / 15:34

2 respostas

2

Como você pergunta sobre programa , você pode usar cgroups :

Crie um cgroup chamado like group1 com um limite de memória (de 50GB, por exemplo, outros limites como CPU são suportados, no exemplo CPU também é mencionado):

cgcreate -g memory,cpu:group1

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

Em seguida, se o aplicativo já estiver em execução, leve o aplicativo para este cgroup:

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

Ou execute seu aplicativo neste cgroup:

cgexec -g memory,cpu:group1 your_app_name
    
por 16.03.2018 / 13:49
0

Redhat tem isto a dizer sobre a afinação o cache da página da VM :

Page cache is a disk cache which holds data of files and executable programs, for example pages with actual contents of files or block devices. Page cache (disk cache) is used to reduce the number of disk reads. To control the percentage of total memory used for page cache in Red Hat Enterprise Linux 5, change the pagecache kernel parameter. The lower the percentage, the more the system favors reclaiming unmapped pagecache memory over mapped memory. High values (like the default value of 100) are not recommended for databases.

The pagecache parameters can be changed in the proc file system without reboot:

# echo "40" > /proc/sys/vm/pagecache

[...]

You can also adjust the minimum free pages using the following command:

# echo 1024 > /proc/sys/vm/min_free_kbytes

Embora o documento possa estar focado no RHEL5, é provável que funcione para sistemas que usam uma interface semelhante, como a sua.

    
por 13.06.2016 / 17:45

Tags