Уже не помню, когда начились проблемы с производительностью при копировании файлов, но тогда я этому не придал большого значения так, как копировал файлы редко. Относительно недавно в моем распоряжении появилось высокоскоростное подключение к сети Интернет и теперь я часто копирую/качаю большие файлы и проблема падения производительности для меня стала очень актуальной.
Поверхностный гуглеж не дал результатов и я начал копать глубже, оказалось, что проблемы высокой нагрузки CPU есть у многих убунтоводов, если не у всех, а решение данной проблемы быстрым поиском не находится, поэтому я решил написать небольшой how-to по устранению высокой нагрузки на процессор при копировании файлов.
При этом на файловых операциях с небольшим числом потоков всё работает хорошо.
Деятельность планировщиков сводится к следующим аспектам:
Рассмотрим вкратце наиболее распространенные.
Для реализации используются 4 очереди: 2 очереди
Лучше всего подходит для организации баз данных.
По реализации, CFQ подразумевает по одной FIFO-очереди на инициатора запросов и переключается между очередями по алгоритму Round-robin.
Не знаю, кому нужна такая честность, но переупорядочения запросов для минимизации перемещения считывающей головки жесткого диска в этом планировщике нет.
Планировщик Anticipatory базируется на Deadline. Подходит для десктопов, т.к. сохраняется отзывчивость подсистемы ввода вывода. Не подходит для RAID, TCQ. Плохо подходит в ситуациях, когда синхронные запросы посылаются разными процессами.
Для SSD дисков и Flash памяти вообще, как отмечено выше, рекомендуется использовать Noop.
Здесь
Например, если диск
На выходе получаем строку вроде этой:
В квадратных скобках указан текущий планировщик.
Здесь
UPD: После внесения изменений нужно обновить конфигурацию grub:
Если у вас grub, а не grub2, то добавляем строку
Презентация на тему I/O Schedulers в Linux
Linux Io Scheduler — Waikato Linux Users Group
A comparison of I/O Schedulers
Планировщики ввода/вывода в Linux (linux kernel io schedule optimization tune)
Книга о Grub 2
Рассказав о данном твике друзьям, удивился, что никто об этом не знал, решил запостить на Хабре, вдруг кому-то пригодится.
UPD:
Данная статья рассказала лишь об одном, по сути самом простом, способе решения проблемы, связанной, c т.н. багом 12309. Есть еще советы по решению данной проблемы:
— не менять планировщик CFQ, но отконфигурировать
— поставить zen ядро
— настроить аггресивность Swap
— купить жесткий диск с аппаратным планировщиком и много оперативки(чтоб в Swap не уходить)
Данный текст распространяется на условиях лицензии CC BY-SA
Оригинальный автор (проблема, решение) — g3n1uss. Соавтор (теория, оформление) — Ваш покорный слуга.
Поверхностный гуглеж не дал результатов и я начал копать глубже, оказалось, что проблемы высокой нагрузки CPU есть у многих убунтоводов, если не у всех, а решение данной проблемы быстрым поиском не находится, поэтому я решил написать небольшой how-to по устранению высокой нагрузки на процессор при копировании файлов.
Проблема
При высокоскоростной закачке торрентов, многопоточном копировании с диска на диск, на флешки, загрузка процессора зашкаливает в 100%, быстро растет LA.При этом на файловых операциях с небольшим числом потоков всё работает хорошо.
Немного теории
Есть такие штуки в операционной системе, называются планировщики ввода-вывода (IO schedulers), которыe являются прослойкой между блочными устройствами и драйверами низкого уровня. Задача планировщика — оптимальным образом обеспечить доступ процесса к запрашиваемому дисковому устройству. В случае жесткого диска — это означает минимизацию перемещений считывающей головки.Деятельность планировщиков сводится к следующим аспектам:
- Увеличение производительности за счет переупорядочения и слияния запросов
- Предотвращение зависаний и перетирания считываемых данных записью
- Честное распределение времени доступа к ресурсам разным процессам
Рассмотрим вкратце наиболее распространенные.
Noop
Простейший планировщик, работающий по принципу FIFO. Переупорядочения нет, слиянию могут подлежать только запросы, находящиеся рядом в очереди. Хорошо подходит для устройств со случайным доступом, вроде Flash памяти.Deadline
Планировщик, кото��ый ставит больший приоритет запросам на чтение, нежели запросам на запись. Запросы переупорядочиваются, но при этом время обработки запроса не должно превышать заданные пределы(по умолчанию, 0.5 с для чтения, 5 с для записи)Для реализации используются 4 очереди: 2 очереди
sorted-by-start-sector(для чтения и для записи) и 2 очереди FIFO(тоже для чтения и для записи). Обычно, запросы берутся из сортированных очередей, но если поджимает deadline(таймаут) первого запроса из очереди FIFO, то обработка запросов продолжается по сортированным очередям с этого элемента.Лучше всего подходит для организации баз данных.
CFQ — Completely Fair Queuing
Цель этого планировщика — честное распределения времени доступа к ресурсу всех инициаторов запросов. CFQ может быть настроен для уравнивания процессов, групп процессов, пользователей.По реализации, CFQ подразумевает по одной FIFO-очереди на инициатора запросов и переключается между очередями по алгоритму Round-robin.
Не знаю, кому нужна такая честность, но переупорядочения запросов для минимизации перемещения считывающей головки жесткого диска в этом планировщике нет.
Anticipatory
Ключевая идея — перед обработкой запросов можно немного подождать, отдохнуть. Зато за эти несколько миллисекунд, соберется информация наперед, которая позволит более взвешенно принимать решения, в каком порядке запросы выполнять.Планировщик Anticipatory базируется на Deadline. Подходит для десктопов, т.к. сохраняется отзывчивость подсистемы ввода вывода. Не подходит для RAID, TCQ. Плохо подходит в ситуациях, когда синхронные запросы посылаются разными процессами.
Решение
Планировщик по умолчанию в Ubuntu 10.10 — CFQ, но как показывает практика именно этот планировщик и вызывает высокую нагрузку на CPU при многопоточном копировании. Изменяем планировщик на другой, например, на Deadline и вуаля — больше нету загрузки CPU под 100%.Для SSD дисков и Flash памяти вообще, как отмечено выше, рекомендуется использовать Noop.
Немного практики
Узнать активный планировщик
Чтобы посмотреть все доступные планировщики в системе и узнать, какой из них активен выполняем:$ cat /sys/block/{DEVICE-NAME}/queue/schedulerЗдесь
{DEVICE-NAME} — имя блочного устройства, например sda. Например, если диск
sda, то нужно выполнить:$ cat /sys/block/sda/queue/schedulerНа выходе получаем строку вроде этой:
noop anticipatory deadline [cfq]В квадратных скобках указан текущий планировщик.
Смена планировщика на лету
Чтобы поменять планировщик в реальном времени без перезагрузки выполняем:$ sudo -i
# echo {SCHEDULER-NAME} > /sys/block/{DEVICE-NAME}/queue/schedulerЗдесь
{SCHEDULER-NAME} — один из присутствующих в системе планировщиков, у меня это: noop anticipatory deadline cfq. Например, чтобы поставить планировщик deadline, выполяем$ sudo -i
# echo deadline > /sys/block/sda/queue/schedulerФиксация настройки планировщика
Далее, нам нужно заставить Ubuntu использовать выбранный нами планировщик и после ��ерезагрузки. Для этого добавляем строкуGRUB_CMDLINE_LINUX_DEFAULT="elevator={SCHEDULER-NAME}" в конфиг GRUB 2.$ sudo nano /etc/default/grubUPD: После внесения изменений нужно обновить конфигурацию grub:
$ sudo update-grubЕсли у вас grub, а не grub2, то добавляем строку
elevator={SCHEDULER-NAME} в /boot/grub/grub.conf.Помощь в выборе планировщика
На хабре уже писали про автоматизированный выбор планировщика. Конечно, простой проверки скорости чтения недостаточно для оптимального выбора, но кое-какое представление дать может.Полезные ссылки
Ссылки, использованные при написании поста:Презентация на тему I/O Schedulers в Linux
Linux Io Scheduler — Waikato Linux Users Group
A comparison of I/O Schedulers
Планировщики ввода/вывода в Linux (linux kernel io schedule optimization tune)
Книга о Grub 2
Рассказав о данном твике друзьям, удивился, что никто об этом не знал, решил запостить на Хабре, вдруг кому-то пригодится.
P.S.
UPD:
Данная статья рассказала лишь об одном, по сути самом простом, способе решения проблемы, связанной, c т.н. багом 12309. Есть еще советы по решению данной проблемы:
— не менять планировщик CFQ, но отконфигурировать
— поставить zen ядро
— настроить аггресивность Swap
— купить жесткий диск с аппаратным планировщиком и много оперативки(чтоб в Swap не уходить)
Данный текст распространяется на условиях лицензии CC BY-SAОригинальный автор (проблема, решение) — g3n1uss. Соавтор (теория, оформление) — Ваш покорный слуга.