Каким-то образом у меня получилось поменять 14 ГБ памяти. После того, как я убил преступника, у меня снова есть тонны свободной памяти, поэтому я подумал, что смогу снова внести важные данные . Итак, из 5 ГБ из 32 ГБ использованных и 14 ГБ пространства подкачки я запустился swapoff -a
.... и через 4 часа примерно половина работы была завершена.
Это означает менее 1 МБ / с, в то время как я могу легко скопировать 200 МБ / с. Мой своп зашифрован, но все обычные разделы тоже, и с помощью aes-ni это не приводит к заметной загрузке процессора (а заполнение пространства подкачки заняло всего несколько минут) Я вижу, что нет особой причины для оптимизации swapoff
, однако мне интересно, как это могло быть так медленно?
Просто добавьте еще немного данных: моя основная память составляет 32 ГБ, и у меня есть 32 ГБ подкачки на каждом из 4 жестких дисков (конечно, излишнее количество, но кого это волнует?). Все пространство подкачки может быть прочитано (расшифровано и) менее чем за 5 минут:
time -p sudo sh -c 'for i in /dev/mapper/cryptswap?; do md5sum $i & done; wait'
014a2b7ef300e11094134785e1d882af /dev/mapper/cryptswap1
a6d8ef09203c1d8d459109ff93b6627c /dev/mapper/cryptswap4
05aff81f8d276ddf07cf26619726a405 /dev/mapper/cryptswap3
e7f606449327b9a016e88d46049c0c9a /dev/mapper/cryptswap2
real 264.27
Чтение части раздела не может быть медленнее, чем чтение всего этого. Тем не менее, чтение примерно 1/10 занимает около 100 раз дольше.
Я заметил, что во время swapoff
обоих процессоров в основном простаивали (возможно, 10% от одного ядра), как и диски («измеряемые» светодиодами). Я также видел, что места подкачки были выключены один за другим.
iostat -d 5
Показывал ли низкий IO на дисках во времяswapoff
тоже?Ответы:
Сначала давайте посмотрим, что вы можете ожидать от своего жесткого диска. Ваш жесткий диск может делать 200 МБ / с последовательно . Когда вы учитываете время поиска, оно может быть намного медленнее. Чтобы выбрать произвольный пример, взгляните на спецификации одного из современных 3-ТБ дисков Seagate, ST3000DM001 :
Максимальная поддерживаемая скорость передачи данных: 210 МБ / с
Ищите среднее чтение: <8,5 мс
Байт на сектор: 4 096
Если вам не нужно искать, и если ваш своп находится рядом с краем диска, вы можете ожидать, что максимальная скорость будет равна 210 МБ / с.
Но если ваши данные подкачки полностью фрагментированы, в худшем случае вам нужно будет искать каждый сектор, который вы читаете. Это означает, что вы можете читать только 4 КБ каждые 8,5 мс, или 4 КБ / 0,0085 = 470 КБ / с.
Так что сразу же, это не исключено, что вы на самом деле работает на скорости жесткого диска.
Тем не менее, кажется глупым, что он
swapoff
будет работать так медленно и должен читать страницы не по порядку, особенно если они написаны быстро (что подразумевает упорядоченность). Но это может быть просто, как работает ядро. В сообщении об ошибке в Ubuntu # 486666 обсуждается та же проблема:Один из ответов был:
Отчет об ошибке был закрыт неразрешенным.
Книга Мела Гормана « Понимание диспетчера виртуальной памяти Linux » немного устарела, но соглашается, что это медленная операция:
В 2007 году было немного больше дискуссий по списку рассылки ядра Linux с темой « ускорение обмена » - хотя обсуждаемые скорости здесь немного выше, чем вы видите.
Это интересный вопрос, который, вероятно, вообще игнорируется, поскольку
swapoff
используется редко. Я думаю , что если вы действительно хотите , чтобы отслеживать его вниз, первый шаг будет пытаться более тщательно следить за свои дисковые модели использования (возможно , сatop
,iostat
или даже более мощные инструменты , такие какperf
илиsystemtap
). Возможными поисками могут быть чрезмерный поиск, небольшие операции ввода-вывода, постоянное переписывание и перемещение данных и т. Д.источник
Я столкнулся с той же проблемой с моим ноутбуком, который имеет SSD, поэтому поиск времени не должен быть проблемой.
Я нашел альтернативное объяснение . Вот выдержка
Так что это проблема ядра, а не что-нибудь еще.
источник
swapoff
реализовано. Когда завершенный процесс завершается, это не занимает много времени.strace swapoff
что почти все, что он делает, это вызываетswapoff
системный вызов.Да,
swapoff
механизм ужасно неэффективен. Обойти это легко: перебирайте процессы, вместо этого перебирайте переставленные страницы. Используйте этот скрипт Python (я не связан):Обратите внимание, что режим работы демона предназначен только для настольных компьютеров / ноутбуков, которые часто находятся в спящем режиме. Я не запустил бы его как демон в серверной системе - просто запустите его на переднем плане, подождите, пока он сообщит, что он позаботился о некоторых процессах, затем остановите его и попробуйте:
Поскольку большинство страниц теперь присутствуют как в разделе подкачки, так и в памяти,
swapoff
они мало что могут сделать и теперь должны быть невероятно быстрыми (я видел сотни МБ / с).Раздел истории впереди
Вышеупомянутый сценарий Python основан на остальной части этого ответа, который, в свою очередь, был моим улучшением этого более старого ответа, автором которого является jlong . Поскольку сценарий намного безопаснее, я рекомендую попробовать только оставшуюся часть моего ответа в качестве последней линии защиты :
Это работает , может быть , 2 секунды и не будет на самом деле сделать что - нибудь, просто список топа - 10 сегментов памяти ( на самом деле он печатает больше острот, да , я действительно люблю остроты, просто изучить команды, принять риск, скопировать и вставить в ваша оболочка, они на самом деле будут читать из свопа).
Основной однострочный текст безопасен (для меня), за исключением того, что он много читает / proc.
Подкоманды, подготовленные для вашего ручного обследования, небезопасны . Каждая команда повесит один процесс на время чтения сегмента памяти из раздела подкачки. Так что небезопасно с процессами, которые не терпят пауз. Скорость передачи, которую я видел, была порядка 1 гигабайта в минуту. (Вышеупомянутый скрипт Python устранил этот недостаток).
Еще одна опасность - слишком сильное давление памяти на систему, так что проверяйте, как обычно
free -m
Что оно делает?
Выход этого сценария Perl представляет собой серию
gdb
команд,dump memory (range)
которые вызывают обмен страниц в памяти.Выходные данные начинаются с размера, поэтому достаточно просто пройти его,
| sort -Vr | head
чтобы получить 10 самых больших сегментов по размеру (SSIZE). В-V
обозначает номер-версии, подходящей сортировки, но это работает для моих целей. Я не мог понять, как заставить работать числовую сортировку.источник
sort -t = -k 2n
/proc/$pid/mem
, искать и читать напрямую. Вот PoC, в значительной степени основанный на вашем фрагменте: gist.github.com/WGH-/91260f6d65db88be2c847053c49be5ae Таким образом, процесс не останавливается, AFAIK не должно быть никаких опасностей, вызванных этим.Во время свопинга, если обнаружен используемый слот подкачки, ядро сначала переставляет страницу. Функция unuse_process () затем пытается найти все записи таблицы страниц, которые соответствуют только что замененной странице, и производит необходимое обновление таблиц страниц. Поиск является исчерпывающим и очень трудоемким: он посещает каждый дескриптор памяти (всей системы) и просматривает записи в своей таблице страниц одну за другой.
Пожалуйста, обратитесь к странице 724 из "Понимание ядра Linux 3-я версия".
источник