Как изменить размер буфера ввода / вывода ядра - PullRequest
7 голосов
/ 12 августа 2011

Я провожу некоторые эксперименты с приложениями, интенсивно использующими ввод / вывод, и пытаюсь понять влияние изменения размера буфера ввода / вывода в ядре, различных алгоритмов лифта и так далее.

Как узнать текущий размер буфера ввода / вывода в ядре? Использует ли ядро ​​более одного буфера по мере необходимости? Как я могу изменить размер этого буфера? Есть ли где-нибудь файл конфигурации, в котором хранится эта информация?

(Для ясности, я не говорю о процессорных или дисковых кэшах, я говорю о буфере, используемом ядром внутри, который буферизует чтение / запись перед тем, как время от времени сбрасывать их на диск).

Заранее спасибо.

Ответы [ 2 ]

9 голосов
/ 12 августа 2011

Ядро не буферизует чтения и записи так, как вы думаете ... Оно поддерживает «кеш страниц», в котором хранятся страницы с диска. Вы не можете манипулировать его размером (ну, не напрямую, во всяком случае); ядро всегда будет использовать все доступной свободной памяти для кэша страниц.

Вам нужно объяснить, что вы действительно пытаетесь сделать. Если вам нужен контроль над тем, сколько данных ядро ​​предварительно извлекает с диска, попробуйте выполнить поиск «linux readahead». (Подсказка: blockdev --setra XXX)

Если вы хотите получить контроль над тем, как долго ядро ​​будет хранить грязные страницы, прежде чем записывать их на диск, попробуйте выполнить поиск "linux dirty_ratio".

Определенное приложение может также полностью обойти кеш страниц с помощью O_DIRECT, и оно может осуществлять некоторый контроль над ним, используя fsync, sync_file_range, posix_fadvise и posix_madvise. (O_DIRECT и sync_file_range относятся к Linux; остальные относятся к POSIX.)

Вы сможете задать лучший вопрос, если сначала ознакомитесь с подсистемой виртуальных машин Linux, особенно с кешем страниц.

3 голосов
/ 13 августа 2011

Я думаю, вы имеете в виду очереди дискового ввода-вывода. Например:

$ cat /sys/block/sda/queue/nr_requests
128

Способ использования этой очереди зависит от используемого планировщика ввода-вывода.

$ cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]

cfq является наиболее распространенным вариантом, хотя в системах с усовершенствованными контроллерами дисков и в виртуальных гостевых системах noop также является очень хорошим выбором.

Для этой информации нет файла конфигурации, о котором я знаю. В системах, в которых мне нужно изменить параметры очереди, я помещаю изменения в /etc/rc.local, хотя вы можете вместо этого использовать полноценный сценарий инициализации и поместить его в RPM или DEB для массового распространения во многих системах.

...