LINUX.ORG.RU

Кеширование дисков выгоняет систему в свап.


1

6

Дано два HDD, 16 гб памяти, один из них USB. Занято 2 гб памяти, кеш несколько сотен мегабайт. Начинаем копировать данные, наблюдаем за кешем диска. После копирования 14 гб, кеш вырастает до 14500 мб и загоняет всю систему в свап, после чего kswapd0 вызывает жесткий iowait. Это гребанное кеширование настраивается?

У меня такое же было на debian 7, ext4 и куче мелких файлов - почему то кеш не освобождался самостоятельно при необходимости.

xtraeft ★★☆☆
()
Последнее исправление: xtraeft (всего исправлений: 1)

Отключил swap, тоже самое: переполнение кеша, kswapd поднимается на самый верх и привет лаги.

steemandlinux ★★★★★
() автор топика

Очистить как-то так можно по идеи: # sync && echo 3 > /proc/sys/vm/drop_caches

А настройка - попробуй погуглить что-то типа dirty_background_ratio, dirty_ratio и dirty_expire_centisecs. Я не особенно помню что каждый из них значит...

Suntechnic ★★★★★
()
Ответ на: комментарий от anonymous

не замечал, только подвисание и смерть внезапно зажравшего слишком много памяти приложения при отсутствии медленного свопа, с ним — пока место в нём есть всё работает прозрачно, но когда кончается — система может уйти подумать минут на 5, в зависимости от размера свопа.

wakuwaku ★★★★
()
Ответ на: комментарий от wakuwaku

не замечал, только подвисание

/0

а передставь, если спавнится куча жручих процессов, например при make

anonymous
()
Ответ на: комментарий от xtraeft

при условии что свободная память еще есть?

нету, из-за пресловутого overcommit «кажется» что её больше

anonymous
()
Ответ на: комментарий от anonymous

Блин, еще один кому не собираюсь доказывать, что можно так делать. Убивается он легко, понятия не имею что он «ядерный». Вот на основе во этой дряни делал, там есть время загрузки процессора, если оно держится 100% например 2 секунды убить.

/*
 * Displays linux /proc/pid/stat in human-readable format
 *
 * Build: gcc -o procstat procstat.c
 * Usage: procstat pid
 *        cat /proc/pid/stat | procstat
 *
 * Homepage: http://www.brokestream.com/procstat.html
 * Version : 2009-03-05
 *
 * Ivan Tikhonov, http://www.brokestream.com, kefeer@netangels.ru
 *
 * 2007-09-19 changed HZ=100 error to warning
 *
 * 2009-03-05 tickspersec are taken from sysconf (Sabuj Pattanayek)
 *
 */


/* Copyright (C) 2009 Ivan Tikhonov

  This software is provided 'as-is', without any express or implied
  warranty.  In no event will the authors be held liable for any damages
  arising from the use of this software.

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not
     claim that you wrote the original software. If you use this software
     in a product, an acknowledgment in the product documentation would be
     appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be
     misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.

  Ivan Tikhonov, kefeer@brokestream.com

*/

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <linux/limits.h>
#include <sys/times.h>


typedef long long int num;

num pid;
char tcomm[PATH_MAX];
char state;

num ppid;
num pgid;
num sid;
num tty_nr;
num tty_pgrp;

num flags;
num min_flt;
num cmin_flt;
num maj_flt;
num cmaj_flt;
num utime;
num stimev;

num cutime;
num cstime;
num priority;
num nicev;
num num_threads;
num it_real_value;

unsigned long long start_time;

num vsize;
num rss;
num rsslim;
num start_code;
num end_code;
num start_stack;
num esp;
num eip;

num pending;
num blocked;
num sigign;
num sigcatch;
num wchan;
num zero1;
num zero2;
num exit_signal;
num cpu;
num rt_priority;
num policy;

long tickspersec;

FILE *input;

void readone(num *x) { fscanf(input, "%lld ", x); }
void readunsigned(unsigned long long *x) { fscanf(input, "%llu ", x); }
void readstr(char *x) {  fscanf(input, "%s ", x);}
void readchar(char *x) {  fscanf(input, "%c ", x);}

void printone(char *name, num x) {  printf("%20s: %lld\n", name, x);}
void printonex(char *name, num x) {  printf("%20s: %016llx\n", name, x);}
void printunsigned(char *name, unsigned long long x) {  printf("%20s: %llu\n", name, x);}
void printchar(char *name, char x) {  printf("%20s: %c\n", name, x);}
void printstr(char *name, char *x) {  printf("%20s: %s\n", name, x);}
void printtime(char *name, num x) {  printf("%20s: %f\n", name, (((double)x) / tickspersec));}

int gettimesinceboot() {
  FILE *procuptime;
  int sec, ssec;

  procuptime = fopen("/proc/uptime", "r");
  fscanf(procuptime, "%d.%ds", &sec, &ssec);
  fclose(procuptime);
  return (sec*tickspersec)+ssec;
}

void printtimediff(char *name, num x) {
  int sinceboot = gettimesinceboot();
  int running = sinceboot - x;
  time_t rt = time(NULL) - (running / tickspersec);
  char buf[1024];

  strftime(buf, sizeof(buf), "%m.%d %H:%M", localtime(&rt));
  printf("%20s: %s (%li.%lis) %f \n", name, buf, running / tickspersec, running % tickspersec,
  (((double)utime) / tickspersec)/
  (((double)running) / tickspersec)

);
}

int main(int argc, char *argv[]) {
  tickspersec = sysconf(_SC_CLK_TCK);
  input = NULL;

  if(argc > 1) {
    chdir("/proc");
    if(chdir(argv[1]) == 0) { input = fopen("stat", "r"); }
    if(!input) {
      perror("open");
      return 1;
    }
  } else {
    input = stdin;
  }


  readone(&pid);
  readstr(tcomm);
  readchar(&state);
  readone(&ppid);
  readone(&pgid);
  readone(&sid);
  readone(&tty_nr);
  readone(&tty_pgrp);
  readone(&flags);
  readone(&min_flt);
  readone(&cmin_flt);
  readone(&maj_flt);
  readone(&cmaj_flt);
  readone(&utime);
  readone(&stimev);
  readone(&cutime);
  readone(&cstime);
  readone(&priority);
  readone(&nicev);
  readone(&num_threads);
  readone(&it_real_value);
  readunsigned(&start_time);
  readone(&vsize);
  readone(&rss);
  readone(&rsslim);
  readone(&start_code);
  readone(&end_code);
  readone(&start_stack);
  readone(&esp);
  readone(&eip);
  readone(&pending);
  readone(&blocked);
  readone(&sigign);
  readone(&sigcatch);
  readone(&wchan);
  readone(&zero1);
  readone(&zero2);
  readone(&exit_signal);
  readone(&cpu);
  readone(&rt_priority);
  readone(&policy);

  {

    printone("pid", pid);
    printstr("tcomm", tcomm);
    printchar("state", state);
    printone("ppid", ppid);
    printone("pgid", pgid);
    printone("sid", sid);
    printone("tty_nr", tty_nr);
    printone("tty_pgrp", tty_pgrp);
    printone("flags", flags);
    printone("min_flt", min_flt);
    printone("cmin_flt", cmin_flt);
    printone("maj_flt", maj_flt);
    printone("cmaj_flt", cmaj_flt);
    printtime("utime", utime);
    printtime("stime", stimev);
    printtime("cutime", cutime);
    printtime("cstime", cstime);
    printone("priority", priority);
    printone("nice", nicev);
    printone("num_threads", num_threads);
    printtime("it_real_value", it_real_value);
    printtimediff("start_time", start_time);
    printone("vsize", vsize);
    printone("rss", rss);
    printone("rsslim", rsslim);
    printone("start_code", start_code);
    printone("end_code", end_code);
    printone("start_stack", start_stack);
    printone("esp", esp);
    printone("eip", eip);
    printonex("pending", pending);
    printonex("blocked", blocked);
    printonex("sigign", sigign);
    printonex("sigcatch", sigcatch);
    printone("wchan", wchan);
    printone("zero1", zero1);
    printone("zero2", zero2);
    printonex("exit_signal", exit_signal);
    printone("cpu", cpu);
    printone("rt_priority", rt_priority);
    printone("policy", policy);
  }

  return 0;
}


ilovewindows ★★★★★
()
Последнее исправление: ilovewindows (всего исправлений: 1)
Ответ на: комментарий от anonymous

но тормозов-то нет. процессы при make не такие уж жручие, там обычно только 1 процесс с ld гигабайт 5-6 хочет.

wakuwaku ★★★★
()
Ответ на: комментарий от wakuwaku

попробуй нагрузить комп чем-нибудь кроме одной вкладки с вконтактом

у меня часто по >500M каждый процесс сс1 жрёт

anonymous
()

Чем копируешь? Обычным cp? Попробуй так: dd if=INPUT_FILE bs=8M | dd of=OUTPUT_FILE bs=8M. Для множества файлов можно использовать скрипты, функции и т.п.

gh0stwizard ★★★★★
()
Ответ на: комментарий от steemandlinux

У dd есть опции не использовать кэш (nocache) и использовать direct i/o (iflag|oflag=FLAG). Можешь с этими опциями поиграться. По умолчанию cp() использует direct i/o, а dd по умолчанию — нет.

Я честно говоря с dd особо не работал, но может поможет :)

gh0stwizard ★★★★★
()

и как же ты интересно за ним наблюдал?

darkenshvein ★★★★★
()
Ответ на: комментарий от anonymous

нету, из-за пресловутого overcommit «кажется» что её больше

Ну что значит «кажется», когда у меня меньше половины только занято (гигабайта 3-4 из 16).

xtraeft ★★☆☆
()
Ответ на: комментарий от ilovewindows

у тебя руки кривые :)

Какие прямые руки позволяют киллять ведро или его треды, расскажи.

xtraeft ★★☆☆
()
Ответ на: комментарий от gh0stwizard

У dd есть опции не использовать кэш

Так какого черта кеш получает такой адский приоритет, что все остальное уходит в своп? Память, занятая под файловый кеш, должна освобождаться для процессов. Разве нет?

xtraeft ★★☆☆
()
Ответ на: комментарий от ilovewindows

ещё момент окончания тромозов совпал с бесконечным числом других событий

скорее всего ты прибил другой жрущий процесс по ошибке и не заметил

обратное можешь доказать показав в документации или коде обработку тредом kswapd0 юзерспейсных сигналов

всё просто

anonymous
()
Ответ на: комментарий от xtraeft

Так какого черта кеш получает такой адский приоритет, что все остальное уходит в своп?

Не знаю, это все разруливается на уровне ядра. Принцип в том, что все, что ядро не может выкинуть из ОЗУ, там и остается. Увы, это мизерная часть, т.к. программы обычно метят страницы для блокирования выгрузки только самые нужные. Если писать хитро, то можно метить вообще все структуры и их страницы для невозможности выгрузки. Но так не делают, ибо гемморно.

Память, занятая под файловый кеш, должна освобождаться для процессов.

Так и происходит, когда процесс запрашивает данные из страницы ушедшей «куда-то там». Только программы запрашивают страницы по мере своей жизнедеятельности, а не так «ооо, ядро спрятоло мою страницу, негодное ядро! верни как завершишь темные делишки!!!1» :)

gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

Так и происходит, когда процесс запрашивает данные из страницы ушедшей «куда-то там». Только программы запрашивают страницы по мере своей жизнедеятельности, а не так «ооо, ядро спрятоло мою страницу, негодное ядро! верни как завершишь темные делишки!!!1» :)

Не не не, я про ситуации, когда вся память занята под кеш и свежезапущенный софт не может эту память заюзать. Такое чувство, что какой то специфичный баг с кешированием инодов в ext4 - то появляется, то пропадает. Вопроизвести не всегда получается, даже описать полную картину внятно то не могу.

xtraeft ★★☆☆
()
Ответ на: комментарий от anonymous

vm.vfs_cache_pressure = 100
Это дефолтный дебиан, я ничего не тюнил.

Большая проблема в том, что эту ситуацию сложно отловить и соответственно найти причину.

xtraeft ★★☆☆
()
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от xtraeft

у меня ext4, часто большая нагрузка на фс и память одновремено, никаких проблем с освобождением кэша не вижу

anonymous
()
Ответ на: комментарий от gh0stwizard

Не совсем. Проблема всплывала на директориях с кучей мелких файлов (повторюсь, такое чувство что баг связан с инодами), причем воспроизводится не всегда.
echo 3 > /proc/sys/vm/drop_caches помогало, кстати.

xtraeft ★★☆☆
()
Ответ на: комментарий от xtraeft

покрути уже vm.vfs_cache_pressure

0 — держать icache dchache в памяти

чем больше число, тем более оно старается освобождать icache dcache

поставь 10000, например

но чтобы мелкие файлы не тормозили нужно вроде наоборот 0-1 если памяти хватает

anonymous
()
Ответ на: комментарий от anonymous

Вон оно чо, конечно не заметил, два месяца не замечал, теперь анонимус из интернета открыл мне глаза. Пойду искать в доках поведение системы при багах, обязательно должно быть. Всегда любил пообщаться с людьми которые расскажут какое у меня мыло в мыльнице , уверенно и с теорией.

ilovewindows ★★★★★
()
Ответ на: комментарий от steemandlinux

100 дефолт, ставь 10000 или больше

но у тебя походу проблема c dirty pages а не icache dcache

anonymous
()
Ответ на: комментарий от ilovewindows

докажи что у тебя есть мыльница

anonymous
()
Ответ на: комментарий от anonymous

покрути уже vm.vfs_cache_pressure

Я могу покрутить, но я не увижу результата, так как прямо сейчас этой проблемы нет, и неизвестно когда она всплывет снова.
За совет спасибо.

но чтобы мелкие файлы не тормозили нужно вроде наоборот 0-1 если памяти хватает

Ээ, как оно будет работать в таком случае - отдавать под кеш инодов фс максимальное количество озу и приоритет?

xtraeft ★★☆☆
()
Ответ на: комментарий от ilovewindows

Вон оно чо, конечно не заметил, два месяца не замечал, теперь анонимус из интернета открыл мне глаза.

Да вобще то тебе не только анонимус про это писал, но и пара человек еще, причем аноним вроде приводил примеры. А ты пока ни одного не привел, так что попридержи коней пока.

xtraeft ★★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.