Что использует мой своп (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добавить его.

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


У меня 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.