Книга: Разработка ядра Linux
Предотвращение перегруженности: для чего нужны несколько потоков
Предотвращение перегруженности: для чего нужны несколько потоков
Один из главных недостатков решения на основе демона bdflush
состоит в том, что демон bdflush
имел всего один поток выполнения. Это приводило к возможности зависания демона при большом количестве операций обратной записи, когда один поток демона bdflush
блокировался на очереди запросов ввода-вывода перегруженного устройства, в то время как очереди запросов других устройств могли быть в этот момент сравнительно свободными. Если система имеет несколько дисков и соответствующую процессорную мощность, то ядро должно иметь возможность загрузить работой все диски. К сожалению, даже при большом количестве данных, для которых необходима обратная запись, демон bdflush
может оказаться загруженным работой с одной очередью и не сможет поддерживать все диски в нагруженном состоянии. Это происходит потому, что пропускная способность диском конечна и, к несчастью, очень низкая. Если только один поток выполняет обратную запись страниц, то он может проводить много времени в ожидании одного диска, так как пропускная способность диска ограничена. Для облегчения этой ситуации ядру необходима многопоточная обратная запись. В таком случае ни одна очередь запросов не может стать узким местом.
В ядрах серии 2.6 эта проблема решается путем введения нескольких потоков pdflush
. Каждый поток самостоятельно выполняет обратную запись страниц памяти на диск, что позволяет различным потокам pdflush
работать с разными очередями запросов устройств.
Количество потоков изменяется в процессе работы системы в соответствии с простым алгоритмом. Если все существующие потоки pdflush
оказываются занятыми в течение одной секунды, то создается новый поток pdflush
. Общее количество потоков не может превышать значения константы MAX_PDFLUSH_THREADS
, которая по умолчанию равна 8. И наоборот, если поток pdflush находился в состоянии ожидания больше одной секунды, то он уничтожается. Минимальное количество потоков равно, по крайней мере, значению константы MIN_PDFLUSH_THREADS,
что по умолчанию соответствует 2. Таким образом, количество потоков pdflush
изменяется динамически в зависимости от количества страниц, для которых необходима обратная запись, и загруженности этих потоков. Если все потоки pdflush
заняты обратной записью, то создается новый поток. Это гарантирует, что ни одна из очередей запросов устройств не будет перегружена, в то время как другие очереди устройств не так загружены и в них тоже можно выполнять обратную запись. Если перегрузка предотвращается, то количество потоков pdflush
уменьшается, чтобы освободить память.
Всё это хорошо, но что если все потоки pdflush
зависнут в ожидании записи в одну и ту же перегруженную очередь? В этом случае производительность нескольких потоков pdflush
не будет выше производительности одного потока, а количество занятой памяти станет значительно большим. Чтобы уменьшить такой эффект, для потоков pdflush
реализован алгоритм предотвращения зависания (congestion avoidance). Потоки активно начинают обратную запись страниц для тех очередей, которые не перегружены. В результате потоки pdflush
распределяют свою работу по разным очередям и воздерживаются от записи в перегруженную очередь. Когда все потоки pdflush
заняты работой и запускается новый поток, то это означает, что они действительно заняты.
В связи с усовершенствованием алгоритмов обратной записи страниц, включая введение демона bdflush
, ядро серии 2.6 позволяет поддерживать в загруженном состоянии значительно большее количество дисков, чем в более старых версиях ядер. При активной работе потоки pdflush
могут обеспечить большую пропускную способность сразу для большого количества дисковых устройств.
- Достоинства и недостатки потоков
- Распараллеливание на несколько процессоров
- 22.4.9 Несколькоадресные рассылки
- Когда печатаю, перед повтором буквы приходится выжидать несколько секунд
- Что делать, если надо создать несколько компакт-дисков с одним набором файлов?
- Для чего нужны папки Windows, Documents and Settings, Program Files и Temp?
- Бывает, что много файлов удаляется быстро, а один файл может удаляться несколько минут. В чем причина?
- Глава 11 Вся жизнь в несколько строчек
- Зачем нужны драйверы?
- Как удалить ненужные команды из контекстного меню?
- Стоит ли заниматься отключением ненужных служб при большом объеме оперативной памяти?
- Как одним щелчком кнопки мыши закрыть несколько окон одновременно?