Как может быть медленным?

Каким-то образом мне удалось заменить 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% от одного ядра), а также диски («измеренные» светодиодами). Я также видел, что места подкачки были отключены один за другим.

4 Solutions collect form web for “Как может быть медленным?”

Во-первых, давайте посмотрим, что вы можете ожидать от своего жесткого диска. Ваш жесткий диск может выполнять 200 МБ / сек последовательно . Когда вы определяете время поиска, оно может быть намного медленнее. Чтобы выбрать произвольный пример, взгляните на спецификации для одного из 3TB-дисков Seagate, ST3000DM001 :

  • Максимальная скорость передачи данных: 210 МБ / с

  • Найти среднее значение: <8.5 мс

  • Байт за сектор: 4096

Если вам не нужно искать, и если ваш своп находится рядом с краем диска, вы можете рассчитывать на максимальную скорость = 210 МБ / с

Но если ваши данные свопинга полностью фрагментированы, в худшем случае вам нужно искать все для каждого сектора, который вы читаете. Это означает, что вы можете читать только 4 КБ каждые 8,5 мс или 4 КБ / 0,0085 = 470 КБ / с

Так что сразу с места в карьер, не исключено, что вы на самом деле бегаете против скорости жесткого диска.


Тем не менее, кажется глупым, что swapoff будет работать так медленно и должен читать страницы не по порядку, особенно если они были написаны быстро (что подразумевает порядок). Но это может быть только то, как работает ядро. Отчет об ошибке Ubuntu # 486666 обсуждает ту же проблему:

 The swap is being removed at speed of 0.5 MB/s, while the hard drive speed is 60 MB/s; No other programs are using harddrive a lot, system is not under high load etc. Ubuntu 9.10 on quad core. Swap partition is encrypted. Top (atop) shows near 100% hard drive usage DSK | sdc | busy 88% | read 56 | write 0 | avio 9 ms | but the device transfer is low (kdesysguard) 0.4 MiB/s on /dev/sdc reads, and 0 on writes 

Один из ответов был:

 It takes a long time to sort out because it has to rearrange and flush the memory, as well as go through multiple decrypt cycles, etc. This is quite normal 

Сообщение об ошибке было закрыто нерешенным.

Книга Мела Гормана « Понимание диспетчера виртуальной памяти Linux » немного устарела, но соглашается с тем, что это медленная операция:

Функция, ответственная за деактивацию области, является, как и sys_swapoff() , так называемой sys_swapoff() . Эта функция в основном связана с обновлением swap_info_struct . Основная задача пейджинга на каждой выгружаемой странице – это ответственность за try_to_unuse() которая чрезвычайно дорога.

В 2007 году в списке рассылки linux-kernel обсуждается немного больше вопросов с вопросом « ускорение swapoff », хотя скорости, которые они обсуждают, немного выше, чем вы видите.


Это интересный вопрос, который, вероятно, вообще игнорируется, поскольку swapoff редко используется. Я думаю, что если вы действительно хотите отследить его, первым шагом будет более тщательное наблюдение за вашими шаблонами использования диска (возможно, с помощью atop , iostat или даже более мощных инструментов, таких как perf или systemtap ). Вещи, которые можно искать, могут быть чрезмерными поисками, небольшими операциями ввода-вывода, постоянным переписыванием и перемещением данных и т. Д.

Я испытываю такую ​​же проблему с моим ноутбуком, у которого есть SSD, поэтому времена поиска не должны быть проблемой.

Я нашел альтернативное объяснение . Вот выдержка

Теперь, как это работает, swapoff просматривает каждую помененную страницу памяти в разделе подкачки и пытается найти все программы, которые ее используют. Если он не сможет найти их сразу, он будет искать таблицы страниц для каждой программы, которая их найдет. В худшем случае он проверяет все таблицы страниц для каждой помененной страницы в разделе. Правильно: одни и те же таблицы страниц проверяются снова и снова.

Так что это проблема ядра, а не что-то еще.

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

См. Стр. 724 «Понимание ядра ядра Linux 3-й версии».

Вам нужно довольно сложное обходное решение, чтобы исправить неэффективный механизм swapoff .

Однострочный

 perl -we 'for(`ps -e -o pid,args`) { if(m/^ *(\d+) *(.{0,40})/) { $pid=$1; $desc=$2; if(open F, "/proc/$pid/smaps") { while(<F>) { if(m/^([0-9a-f]+)-([0-9a-f]+) /si){ $start_adr=$1; $end_adr=$2; } elsif(m/^Swap:\s*(\d\d+) *kB/s){ print "SSIZE=$1_kB\t gdb --batch --pid $pid -ex \"dump memory /dev/null 0x$start_adr 0x$end_adr\"\t2>&1 >/dev/null |grep -v debug\t### $desc \n" }}}}}' | sort -Vr | head 

Это может занять 2 секунды, и на самом деле ничего не на самом деле, просто перечислите 10 сегментов памяти (на самом деле он печатает больше однострочных номеров, да, я люблю однострочники, просто изучаю команды, принимаю риск, копирую и вставляю в ваша оболочка, на самом деле это будет читать из swap).

 ...Paste the generated one-liners... swapoff /your/swap # much faster now 

Какие-нибудь опасности?

Основной однострочный вкладыш безопасен (для меня), за исключением того, что он читает много / proc.

Подкоманды, подготовленные для проверки вручную, небезопасны . Каждая команда будет висеть один процесс на время чтения сегмента памяти из swap. Таким образом, это небезопасно с процессами, которые не переносят никаких пауз. Скорость передачи, которую я видел, составляла порядка 1 гигабайта в минуту.

Еще одна опасность – слишком большое давление памяти на систему, поэтому проверьте обычную free -m

Но что он делает?

 for(`ps -e -o pid,args`) { if(m/^ *(\d+) *(.{0,40})/) { $pid=$1; $desc=$2; if(open F, "/proc/$pid/smaps") { while(<F>) { if(m/^([0-9a-f]+)-([0-9a-f]+) /si){ $start_adr=$1; $end_adr=$2; } elsif( m/^Swap:\s*(\d\d+) *kB/s ){ print "SSIZE=$1_kB\t gdb --batch --pid $pid -ex \"dump memory /dev/null 0x$start_adr 0x$end_adr\"\t2>&1 >/dev/null |grep -v debug\t### $desc \n" } } } } } 

Вывод этого скрипта perl представляет собой серию dump memory (range) gdb dump memory (range) которая swapoff в память и, кстати, делает более swapoff (я видел сотни МБ / с). Основная идея использования gdb и smaps исходит из этого ответа jlong .

Выход начинается с размера, поэтому достаточно легко пройти его через | sort -Vr | head | sort -Vr | head чтобы получить 10 крупнейших сегментов по размеру (SSIZE). -V означает подходящую сортировку по версии, но она работает для моей цели. Я не мог понять, как сделать численное сортирование.

  • error: слишком много слов `` в cat
  • Является ли своп анахронизмом?
  • Почему Linux не защищает ОС от обмена?
  • Где поставить пространство подкачки, с начала или конца и другие вопросы свопинга
  • Поиск и замена полной строки в рекурсивных файлах
  • Без подкачки
  • Какова цель нескольких файлов подкачки
  • Как определяется статус возврата переменной назначения?
  • Как проверить, активен ли swap из командной строки?
  • Использование команды внутри подстановки sed
  • Linux и Unix - лучшая ОС в мире.