Что использует мой своп (Ubuntu)?

30

У меня есть сервер Ubuntu 8.04, на котором работает база данных, и несколько серверов приложений Java. Его конфигурация и использование памяти:

             total       used       free     shared    buffers     cached
Mem:      16456176   15930028     526148          0      81372    9674196
-/+ buffers/cache:    6174460   10281716
Swap:      1951888     366100    1585788

Я заметил, что своп повышается каждый день и выпускается ночью. Спрос не одинаков во все дни и начинается в разное время. Так что это довольно случайно, за исключением нечеткой границы «день-ночь».

Нагрузка на эту машину меняется в течение дня. Это очень низкое значение с полуночи до 6-7 часов утра, намного выше (но стабильно) до 6-8 часов вечера, затем постепенно снижается.

Теперь у меня есть следующие вопросы:

  1. Как я могу увидеть, какие процессы используют своп?
  2. Почему он предпочитает выменять, а не брать немного памяти из кеша?
Конрад Гарус
источник

Ответы:

25

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

Вы можете получить представление о том, сколько памяти разных типов использует каждый процесс в topили htop. Ни один не показывает использование подкачки по умолчанию, но оба могут быть настроены на (сверху: нажмите fи включите SWAPстолбец; htop: нажмите F2, добавьте NSWAPстолбец). Вы можете получить больше информации о конкретном процессе, cat /proc/12345/vmstatгде 12345указан идентификатор процесса. Обратите внимание, что «сколько подкачки использует программа» не полностью определено, так как некоторые страницы совместно используются несколькими процессами.

Существует два основных типа конкурентов для оперативной памяти: память процесса (которая может быть выгружена) и дисковые кэши (которые можно перечитать из файла). Нет причин всегда отдавать приоритет памяти процесса над дисковым кешем: лучше выгрузить редко используемую часть памяти процесса, чем снова и снова читать файл в память. Цифры, которые вы даете, с примерно половиной (скажем, 30–70%) памяти, предназначенной для дискового кэша, типичны для систем, которые имеют достаточный объем ОЗУ для задач, которые они должны выполнять.

Жиль "ТАК - перестань быть злым"
источник
6
Я не могу найти NSWAPстолбец (Ubuntu 16.04: /).
jjmontes
1
@jjmontes Это было удалено . Я не знаю почему.
Жиль "ТАК - перестань быть злым"
В htop FAQ говорится, что автор не верит, что можно точно сообщить об использовании свопа, а показатель вершины неверен.
Оливер Эванс
0

В StackOverflow уже есть отличный ответ на ваш первый вопрос («Какой процесс на самом деле использует своп?»).

/programming//a/7180078/1442301

Короче говоря, инструменты любят topили htopне предоставляют точную информацию об использовании подкачки. Вы должны погрузиться в /procпапку (в псевдо-файле /proc/$PID/smaps), чтобы получить более точную информацию.

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

Ксавье
источник
0

С htop v1.01, я нажал «S» , чтобы добавить NSWAPстолбец вместо «F2» (как это было предложено Gilles), затем Columns> Available Columns> и F5добавить его.

введите описание изображения здесь

Genjo
источник
У меня htop 2.0.1, и я не вижу опции NSWAP :(
Адам,
1
@ Adam Специалист по обслуживанию не хочет больше показывать этот столбец из-за отсутствия надежного способа получить эту информацию; см. Почему htop не имеет столбец SWAP, например top?
Генджо
0

Без опроса и анализа результатов работы таких инструментов, как vmstat, freeи top, лучшим местом для поиска могут быть crontabs пользователя root или других пользователей в системе. Если общая нагрузка на систему резко возрастает в определенное время, есть вероятность, что в cron существует процесс, который создает потребность в ресурсах. В противном случае вы всегда можете создать утилиту для одноразовой регистрации в гетто с помощью scriptутилиты, которая просто записывает все, что идет в STDOUT.

Так что, если мне нужно было сделать одноразовый скрипт, чтобы перехватить вывод для последующей проверки, в одном терминале я бы набрал:

script /tmp/free.txt

а потом

while (true); do date; free; sleep 30; done

и в другом терминале

script /tmp/top.txt

а потом

while (true); do date; top -n 1; sleep 30; done

а затем на следующее утро убейте оба scriptвызова и сопоставьте выходные данные topиfree

еще раз это гетто подход, но звучит так, как будто вам нужен только один раз

Вы также можете прочитать руководство по обмену Ubuntu

Брэд Клоузи
источник