Обход кэшей в Linux

Тема в разделе "WASM.UNIX", создана пользователем coder_x, 2 июл 2008.

  1. coder_x

    coder_x New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    12
    День добрый. Возникли проблемы с файловой системой, конкретно необходимо максимально отрубить кэширование всех ее структур, чтобы максимально сохранять целостность ФС при резком отключении питания (Debian 2.6 kernel). Читал в нете, нашел указания на параметр /proc/sys/vm/vfs_cache_pressure - но это несколько не то конечно. Разумеется если после каждого write делать sync() проблема частично решается, но это в принципе очень избыточно и неудобно по времени исполнения (фактически sync дважды подряд сбрасывает все кеши на диск). Сейчас смотрю в сторону правки исходного кода ядра, например после каждой модификации каких-либо структур или данных сразу сбрасывать изменения на диск. В связи с этим хотел бы узнать ваше мнение, стои ли этим заниматься или например запустить демона, который бы вызывал sync с некоторой периодичностью (что-то типа pdflush). А еще интересует есть ли какие готовые решения или патчи на ядро.
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    сначала посмотри linux/Documentation/filesystems/proc.txt (раздел 2.4)
    если ничего из перечисленного там не поможет, будем думать дальше
     
  3. coder_x

    coder_x New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    12
    Поглядел, попробовал подтюнить следующие параметры:

    Код (Text):
    1. echo "1" > /proc/sys/vm/dirty_writeback_centisecs
    2. echo "0" > /proc/sys/vm/dirty_expire_centisecs
    3. echo "0" > /proc/sys/vm/dirty_background_ratio
    4. echo "100000" > /proc/sys/vm/vfs_cache_pressure
    результат надо сказать так себе, контролируя визуально доступ к диску и поэкспериментировав могу сказать что кэши сбрасываются никак не раньше 1 с (в лучшем случае).
    потом прочитал в одной статье следующее: "if a writeback event takes longer than a dirty_writeback_centisecs interval, then leave a one-second gap". Нашел в ядре это место:
    Код (Text):
    1. static void wb_timer_fn(unsigned long unused)
    2. {
    3.     if (pdflush_operation(wb_kupdate, 0) < 0)
    4.         mod_timer(&wb_timer, jiffies + HZ); /* delay 1 second */
    5. }
    сразу заменил HZ на dirty_writeback_interval и пересобрал ядро. Резульат неоднозначный - опять таки поэкспериментировав получил следующее: то кэши сбрасываются почти одновременно с записью, то опять блин до 2-3 секунд промежутки. Это конечно не дело, надо как-то осуществлять сразу сквозную запись через кэш на диски.

    Да, забыл сказать, еще на всякий пожарный сделал "renice 18 pdflush".
     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    это помогает тем лучше, чем больше процессов pdflush запущено
     
  5. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    опция sync при монтировании.
     
  6. coder_x

    coder_x New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    12
    to r90:
    да, это помогло в принципе, но интересует вопрос а все ли всетаки скидывается на диск? например метаданные или еще что. А то откопал у mount еще и параметр dirsync - вроде для синхронизации директорий и фиг знает что так еще может быть.

    to all
    а еще напрягает неравномерность времени записи на диск (после монтажа с sync), колебания по времени до 90 миллисекунд на один write! Ну время записи большое это уже ничего не поделаешь, интересно из-за чего, пробовал ставить разные дисциплины диспетчеризации процессов - результат тот же. Может это pdflush периодически просыпается и надолго лочит кэши? Можно ли его какнибудь отлучить от сброса кэшей файловой системы или это важная часть этого механизма?
    ЗЫ
    не подумайте что я тут ерундой страдаю, просто на работе требуют :)
     
  7. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    sync -- это полноценный sync, то есть если пишется что-то на дискету и write отработал, то дискету можно вытаскивать.

    Любопытно чего же такого требуют... Если:
    То чем не устраивает журналируемая фс? ext3 у меня ни разу не падал из-за неожиданных выключений.
    Потери данных, которые за последнюю секунду были write в кеш, но не успели sync на диск? Ну если этот временной промежуток хочется уменьшить, я бы сделал так:
    Код (Text):
    1. #include <unistd.h>
    2. int main ()
    3. {
    4.     if (fork ()) {
    5.         return 0;
    6.     }
    7.     if (fork ()) {
    8.         return 0;
    9.     }
    10.     chdir ("/");
    11.     close (STDIN_FILENO);
    12.     close (STDOUT_FILENO);
    13.     close (STDERR_FILENO);
    14.     while (1) {
    15.          usleep (100000);
    16.          sync ();
    17.     }
    18. }
     
  8. coder_x

    coder_x New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    12
    спасибо за совет, sync в принципе нормаьно подходит, просто хотелось, что бы время записи на диск было более-менее одинаковым, а то замеряю сколько делается write, оказывается разброс в разы! И дисковой активности то вроде нет, своп отключен, pdflush вообще почти не просыпается и приоритеты повышал (nice=-19), пробовал разные ioscheduler-ы для диска. Вот щас собрал ядро с опциями CONFIG_PREEMPT и CONFIG_PREEMPT_BKL - таже петрушка, что такое не пойму.
     
  9. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Я подозреваю всё просто упирается в количество чтений/записей которые надо сделать в ответ на write. Там же не просто сектор переписать, быть может к файлу ещё один inode прицепить, быть может не один, может быть найти свободный блок. Поэтому, думаю и возникает разброс.
     
  10. coder_x

    coder_x New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    12
    Нет, файл создается один раз creat-ом и блоки пишутся одинакового размера в него с начала файла (файловая система смонтирована c опцией sync), одновременно выводится статистика времени выполнения write, после нескольких записей файл закрывается. Если процессу понизить nice, то временные отклонения становятся реже, но все равно есть, думаю что это закидоны шедулера процессов или в/в шедулера. Ну да ладно, в принципе я с этим смирился, спасибо и на этих советах, но конечно если будут идеи - буду благодарен.
     
  11. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    coder_x
    Это ты пишешь блоки одинакового размера. А драйвер фс на каждый твой блок производит одну или более записей. Если при записи твой блок перевалил через границу в 4096 байт (или какой у тебя там размер блока фс?), то драйвер должен из свободных блоков на диске выбрать ещё один, удалить его из списка свободных, добавить в список блоков файла и вписать туда данные. Если речь идёт о журналируемой фс, то всё становиться ещё чуть сложнее. Я не настолько знаток формата ext2/3, чтобы сказать точно сколько секторов жёсткого диска будет переписано, но явно не один.
     
  12. coder_x

    coder_x New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    12
    r90, ты не понял, после каждой записи блока я делаю seek опять на начало файла, т.о. пишется на одно и тоже место все время.