Фикс падения производительности при копировании/закачке файлов в Ubuntu

    Уже не помню, когда начились проблемы с производительностью при копировании файлов, но тогда я этому не придал большого значения так, как копировал файлы редко. Относительно недавно в моем распоряжении появилось высокоскоростное подключение к сети Интернет и теперь я часто копирую/качаю большие файлы и проблема падения производительности для меня стала очень актуальной.

    Поверхностный гуглеж не дал результатов и я начал копать глубже, оказалось, что проблемы высокой нагрузки 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/grub

    UPD: После внесения изменений нужно обновить конфигурацию 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. Соавтор (теория, оформление) — Ваш покорный слуга.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 36

      0
      Ходят слухи что noop рулит. Для девайсов с NCQ. Только тестов я не видел.
      И как бы BFQ ещё есть.
        +2
        Только BFQ, только BFS, только ck-patchset!
          0
          Ну зачем-же так категорично, есть еще вполне себе дееспособный zen-linux, где еще можно и slqb прикрутить, да и вообще более тонко настроить ядро.
            0
            скажите, а есть способ поставить BFQ в убунте без пересборки ядра из сорцов? PPA к примеру?
              0
              Есть. Но не уверен, что Вас устроит. Там до сих пор ядро версии 2.6.32-31.
                0
                Есть и более свежая. Только у меня иксы с этим ядром не стартуют. Сходу решение не нагуглил, а разбираться было влом, так что живу пока на стоковом ядре.
            +3
            У меня нагрузка зашкаливала только при работе с ntfs, через ntfs-3g.
              +4
              Что естественно, так как ntfs-3g исполняется в userspace и накладные расходы больше на один-два порядка по сравнению с нативными драйверами ФС в kernel space.
              +3
              К несчатью это не всегда помогает.
                0
                Это старый добрый дефект 12309.
                В последнем ядре 2.6.38 добавили новый планировщик, который немного его устраняет.
                  +6
                  нет единого бага 12309. Есть комплекс причин.
                  0
                  как то игрался со всеми на своем Eee900, но не знал как зафиксировать, чтобы работал после перезагрузки, теперь добавил, спасибо.
                  К слову, у кого SSD рекомендовано держать занятым только 75% от общего объема жесткого диска.
                  Думаю скоро купить новый ноут (lenovo x120e) и вставить туда SSD на 80 гиг, какой планировщик посоветуете? noop?
                    +1
                    Попробую сегодня на n900, может торенты станет возможно качать, спасибо :)
                      +4
                      уважаемый автор, что это?
                      sites.google.com/site/linuxoptimization/home/nastrojka-io-sheduler
                        +1
                        чтобы упредить минусы, скажу сразу: выпало на первой странице выдачи гугла по запросу «io scheduler». вы либо скривили душой, что долго гуглили, либо это репост.
                          +2
                          Думаю, g3n1uss имел ввиду, что поиск а гугле по симптомам своей проблемы, а это было именно падение производительности в конкретных случаях, не дал результатов. Ведь для неопытных пользователей сложнее всего именно локализовать проблему.

                          Насчет моей теоретической части — это тоже не репост. Я просто читал презентацию, ссылка на которую приведена в статье — и записывал свои впечатления. Если честно, я даже не гуглил эту информацию на русском, просто удостоверился, что на Хабре это не освещалось.
                            +2
                            Так и есть, откуда мне знать, что производительность падает именно из-за планировщика, если я даже не знал, что это такое?
                          +1
                          А реально ли сделать автовыбор планировщика для различных девайсов? Скажем, по умолчанию считать noop (для подключаемых флешек), а на некоторые диски (жёсткие диски, количество которых обычно неизменно) — поставить anticipatory?
                            0
                            Можно попробовать поставить noop в Grub или ядро, а для нужных блочных устройств прописать
                            echo anticipatory > /sys/block/{BLOCK-DEVICE}/queue/scheduler
                            в /etc/rc.d/rc.local
                            +2
                            И Вас тоже с 1-м апреля :)
                              0
                              Ага, судя по всему, хорошей первоапрельской шуткой с моей стороны было не рассмотреть в статье планировщик BFQ. :)
                              +2
                              $ cat /sys/block/sda/queue/scheduler 
                              noop deadline [cfq] 
                              $ uname -a
                              Linux tigr-desktop 2.6.35-28-generic #50-Ubuntu SMP Fri Mar 18 19:00:26 UTC 2011 i686 GNU/Linux
                              $ lsb_release -a
                              No LSB modules are available.
                              Distributor ID:	Ubuntu
                              Description:	Ubuntu 10.10
                              Release:	10.10
                              Codename:	maverick
                              
                              Собственно, чем объяснить отсутствие anticipatory?
                                +2
                                Тем, что его с 2.6.33, вроде, выпилили окончательно и бесповоротно.
                                0
                                это я один не вижу здесь update-grub?
                                  0
                                  Да, не хватает, поправим.
                                  +1
                                  Можно было просто написать про баг 12309. Лечится собирание ядра с zen-патчем или покупкой винта с аппаратным шедулером.
                                    +1
                                    Если не ошибаюсь, то я тоже сталкивался с похожей проблемой, которую описал в вопросе Q&A: habrahabr.ru/qa/4371/
                                    Возможно будет полезно.
                                      0
                                      Кстати, отличная тема на подумать для тех, кто до сих пор считает, что мол, собрать систему хранения за копейки — пара пустяков, «взять сервак, набить его дисками и поставить Линукс».
                                      Регулярно такие энтузиасты обламываются, но все равно прибывают все новые.
                                        +1
                                        CFQ, кстати, идеально подходит для shared-хостинга. Идеального, конечно, которому пользователи важнее амортизации дисков:)
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                            0
                                            Наздоровье. Проблему с интернатом попробуйте описать в Q&A
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                              0
                                              решили ли вы проблему
                                              Вот только интернет при закачке торрентов по прежнему жутко глючит (в Windows все нормально)

                                              Если да, поделитесь пожалуйста как?
                                              • НЛО прилетело и опубликовало эту надпись здесь
                                              0
                                              «купить жесткий диск с аппаратным планировщиком» —
                                              это какие?
                                                0
                                                Спасибо, очень помогла статья, у меня на ноуте стоит ssd диск, cfg поменял на noop глюки изчезли. До этого фильм не мог на флешку скинуть, все тормозило.

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

                                                Самое читаемое