Подтвердить что ты не робот

Почему высокие скорости ввода-вывода замедляют работу на Linux?

Это может быть немного OT, но мне было интересно, почему с процессом, который сильно использует IO (скажем, cp большой файл из одного места в другое на том же диске) замедляет все, даже процессы, которые в основном связаны с процессором. Я заметил, что на обеих ОС я сильно использую (mac os x и linux).

В частности, мне интересно, почему многоядерный сервер действительно не помогает здесь: это аппаратное ограничение для товарного оборудования (контроллер диска и т.д.), ограничение os, или есть что-то по своей сути трудно выделить ресурсы (планирование)?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Это может быть ограничение текущего планировщика. Google "Galbraith sched: autogroup patch" или "linux miracle patch" (да, действительно!). Там, по-видимому, 200-строчный патч в процессе уточнения и объединения, который добавляет групповое планирование, о котором Линус говорит:

Я также очень доволен тем, что он делает для интерактивной работы. По общему признанию, мой "тестовый тест" действительно тривиален (чтение электронной почты в веб-браузер, немного прокручиваясь, делая "make -j64" на ядро в то же время), но это тестовый сценарий, который очень уместен для меня. И это огромное улучшение.

Видеоролики до и после здесь.

Ответ 3

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

В случае cp он также использует значительный объем доступной пропускной способности памяти, поскольку каждый блок данных копируется в и из пользовательского пространства. Это также приведет к изъятию данных, требуемых другими процессами из кэшей CPU и TLB, что замедлит другие процессы, поскольку они будут пропускать пропуски кэша.

Ответ 4

Кроме того, вы знаете способ проверки вашей гипотезы на linux, например. количество прерываний при интенсивных операциях ввода-вывода.

Чтобы сделать с прерываниями, я предполагаю, что гипотеза кафе:

  • много прерываний в секунду;
  • прерывания обслуживаются любыми/всеми ЦП;
  • поэтому прерывания очищают кэширование CPU.

Статистика, которую вам нужно проверить, это количество прерываний в секунду на каждый процессор.

Я не знаю, можно ли связать прерывания с одним процессором: подробнее см. http://www.google.com/#q=cpu+affinity+interrupt.

Здесь что-то я не понимаю (это первый раз, когда я посмотрел на этот вопрос): perfmon на моем ноутбуке (работает под управлением Windows Vista) показывает 2000 прерываний/секунду (1000 на каждом ядре), когда он почти не работает (ничего не делая, кроме отображения perfmon). Я не могу себе представить, какое устройство генерирует 2000 прерываний/секунду, и я бы подумал, что достаточно, чтобы сдуть кэши процессора (я думаю, что квант процессора для занятого потока составляет примерно 50 мс). Он также показывает в среднем 350 DPC/сек.

У аппаратов высокого уровня страдают от подобных проблем?

Одним из разновидностей аппаратного разлома может быть аппаратный диск и драйвер дискового устройства, генерирующий больше или меньше прерываний и/или других утверждений.