Назад | Перейти на главную страницу

Linux с 256 ГБ памяти / 48 ядер - машина начинает работать / задыхаться, когда осталось тонны памяти

Машина: Dell r815, CentOS 5.4, 256 ГБ ОЗУ, 4 x 12 ядер.

У нас есть приложение с файлом размером 275 ГБ. Он выполняет сортировку на месте по 20 ГБ данных за раз, то есть меняет местами биты и заменяет их в том же файле. Все работает нормально.

Существует последний проход, который затем читает весь файл и выполняет сортировку слиянием на разных блоках по 20 ГБ и выводит их в совершенно новый файл.

Этот процесс ВИДЕТЬ, что какое-то время работает нормально, и в итоге на диск сбрасывается около 50 ГБ. Через какое-то время ВСЯ машина начинает нервничать.

Простые команды вроде ps -ef, ls -al, зависают на долгое время и отображаются как загружающие 100% ЦП (это всего лишь одно ядро).

Глядя на статистику памяти на top, Я вижу, что он использует около 120 ГБ ОЗУ (то есть 128 ГБ свободно) и имеет 120 ГБ в разделе «кэширование».

Кто-нибудь видел такое поведение раньше? Тот же процесс отлично работает на машине с 64 ГБ памяти - поэтому я почему-то думаю, что это связано с монтированием оперативной памяти, которая у меня есть на машине.

(пока мы говорим, я запускаю тест на этой машине со всеми, кроме 64 ГБ - чтобы исключить проблему с оборудованием).

Возможно, мне не хватает некоторых параметров vm в /etc/sysctrl.conf?

Спасибо!

Таким образом, это оказалось ошибкой ядра в 64-битной Centos 5.4 И 64-битной Fedora 14. После того, как я установил Centos 5.5, проблема исчезла.

Извините, у меня нет лучшего ответа для всех ...

Ваш вопрос напомнил мне кое-что, что я недавно прочитал:

http://jcole.us/blog/archives/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/

Это касается того, как архитектуры NUMA (например, в 48-ядерной системе AMD) влияют на распределение и подкачку памяти. Я не знаю, с чем вы столкнулись, но это звучало достаточно похоже, и его стоит прочитать.

Даже если это не ответ, чтение будет увлекательным.

Вы можете попробовать добавить строку в /etc/sysctl.conf, чтобы указать, что своп должен использоваться только в случае крайней необходимости.

swappiness = 0

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

Где твое временное пространство. Часто это происходит на tempfs. Tempfs извлекает это пространство из памяти, зарезервированной с помощью пространства подкачки, поэтому, если в конечном итоге в tempfs будет слишком много материала, он вызовет ввод-вывод подкачки.

Учитывая размер данных, которые вы объединяете, я ожидал бы, что при окончательном слиянии будет происходить замена.

Может помочь распространение хранилища подкачки на несколько дисков.

Хотя вы можете не использовать свопинг, вы все равно можете быть привязаны к вводу-выводу. Информация ls предполагает это.

Я бы посмотрел на результат dstat -df чтобы показать статистику диска, или dstat -af (да, это будет баджиллион столбцов шириной; это то, что происходит, когда у вас 48 ядер и показывается загрузка ЦП на всех из них), если вы хотите увидеть все это.

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