Просмотр карты памяти процесса
Хватит разговоров; давайте посмотрим, как обстоят дела с этим «огромным» процессом Writer. Чтобы увидеть, как выглядит память Writer, воспользуемся программой pmap (с флагом -d после которого идёт PID (идентификатор процесса)):
pmap -d 450151
Я вырезал много вывода; остальное похоже на то, что показано. Даже без полного вывода мы можем увидеть некоторые очень интересные вещи
Важно отметить, что в выводе каждая разделяемая библиотека указана дважды; один раз для сегмента кода и один раз для сегмента данных. Сегменты кода имеют режим «r-x—», в то время как данные установлены на «rw—»
Столбцы Kbytes, Mode и Mapping — единственные, о которых мы будем заботиться, так как остальные не важны для обсуждения.
Если вы просмотрите вывод, вы обнаружите, что строки с наибольшим количеством килобайт обычно являются сегментами кода включённых разделяемых библиотек (те, которые начинаются с «lib», являются разделяемыми библиотеками). Что замечательно в этом, так это то, что они могут быть разделены между процессами. Если вы вычлените все части, которые совместно используются процессами, вы получите общее количество «writeable/private», которое отображается в нижней части вывода.
mapped: 12769744K writeable/private: 1037844K shared: 278856K
Это то, что можно считать дополнительными затратами этого процесса без учёта разделяемых библиотек. Следовательно, стоимость запуска этого экземпляра Writer (при условии, что все общие библиотеки уже загружены) составляет около 1 гигабайта. Это совсем другая история по сравнению с 12 гигабайтами, о которых сообщила ps.
Отображение с помощью параметра -T статистических данных для выбранных процессов и их дочерних процессов
Используйте параметр -T и укажите либо значение CHILD, либо значение TASKS. В таких случаях будет выдана статистика либо о задачах, либо о задачах и их дочерних процессах. Вы также можете указать параметр ALL.
Возможные значения параметра -T: CHILD, TASKS или ALL.
# pidstat -T CHILD | head Linux 3.0.101-0.7.17-default (thegeekstuff) 07/30/14 _x86_64_ 10:13:34 IST PID usr-ms system-ms guest-ms Command 10:13:34 IST 1 7950 3340 0 init 10:13:34 IST 3 0 420 0 ksoftirqd/0 10:13:34 IST 8 0 10 0 migration/0 10:13:34 IST 10 0 1190 0 rcu_sched 10:13:34 IST 11 10 0 0 watchdog/0 10:13:34 IST 12 10 0 0 watchdog/1 10:13:34 IST 13 0 450 0 ksoftirqd/1
Физическая память vs. Виртуальная память
Основное различие между физической и виртуальной памятью заключается в том, что физическая память относится к оперативной памяти компьютера, подключенной непосредственно к его материнской плате. Именно в ней находятся выполняемые в данный момент программы. А виртуальная память — это метод управления, расширяющий при помощи жесткого диска объем физической памяти, благодаря чему у пользователей появляется возможность запускать программы, требование к памяти которых превышает объем установленной в компьютере физической памяти.
Физическая память | Виртуальная память |
Непосредственно установленная в компьютере оперативная память. | Метод управления памятью, с помощью которого для программ создается иллюзия наличия в системе (физической) памяти, гораздо больше реально установленной. |
Работает быстрее. | Работает медленнее. |
Ограничена размером чипа ОЗУ. | Ограничена размером жесткого диска. |
Может напрямую обращаться к процессору. | Не может напрямую обращаться к процессору. |
Использует swapping. | Использует paging. |
Рассмотрим данные пункты:
#1: Тип памяти:
Физическая память является фактической памятью.
Виртуальная память является логической памятью.
#2: Скорость:
Физическая память быстрее виртуальной памяти.
#3: Размер:
Физическая память ограничена размером чипа ОЗУ.
Виртуальная память ограничена размером жесткого диска.
#4: Процессор:
Физическая память может напрямую обращаться к процессору, в то время как виртуальная память — нет.
#5: Методы, лежащие в основе:
Физическая (оперативная) память использует swapping. — это концепция управления памятью, при которой всякий раз, когда системе для хранения данных некоторого процесса не хватает оперативной (физической) памяти, она берет её из вторичного хранилища (например, жесткого диска), сбрасывая на него временно неиспользуемые данные. В Linux есть специальная программа управления памятью, которая управляет этим процессом. Всякий раз, когда ОЗУ не хватает памяти, программа управления памятью ищет все те неактивные блоки данных (страницы), присутствующие в ОЗУ, которые не использовались в течение длительного времени. Когда она успешно находит подобные блоки, то перемещает их в память подкачки (например, на жесткий диск). Таким образом, освобождается пространство оперативной памяти, и, следовательно, его можно использовать для некоторых других программ, которые нуждаются в срочной обработке.
Виртуальная память использует paging. — это метод выделения памяти, при котором разным несмежным блокам памяти назначается фиксированный размер. Размер обычно составляет 4 КБ. Paging всегда выполняется между активными страницами (pages).
Непрерывное распределение памяти
Основная память должна задействовать как операционную систему, так и различные клиентские процессы
Таким образом, выделение памяти становится важной задачей операционной системы. Память обычно делится на два раздела: один для резидентной операционной системы и один для пользовательских процессов
Обычно нам нужно, чтобы несколько пользовательских процессов находились в памяти одновременно. Следовательно, нам нужно подумать о том, как выделить доступную память для процессов, которые находятся во входной очереди, ожидая ввода в память. При выделении смежной памяти каждый процесс содержится в одном непрерывном сегменте памяти.
Команда ps в Linux
Сначала рассмотрим общий синтаксис команды, здесь все очень просто:
$ ps опции
$ ps опции | grep параметр
Во втором варианте мы используем утилиту grep для того, чтобы отобрать нужные нам процессы по определенному критерию. Теперь рассмотрим опции утилиты. Они делятся на два типа — те, которые идут с дефисом Unix и те, которые используются без дефиса — BSD. Лучше пользоваться только опциями Unix, но мы рассмотрим и одни и другие. Заметьте, что при использовании опций BSD, вывод утилиты будет организован в BSD стиле.
- -A, -e, (a) — выбрать все процессы;
- -a — выбрать все процессы, кроме фоновых;
- -d, (g) — выбрать все процессы, даже фоновые, кроме процессов сессий;
- -N — выбрать все процессы кроме указанных;
- -С — выбирать процессы по имени команды;
- -G — выбрать процессы по ID группы;
- -p, (p) — выбрать процессы PID;
- —ppid — выбрать процессы по PID родительского процесса;
- -s — выбрать процессы по ID сессии;
- -t, (t) — выбрать процессы по tty;
- -u, (U) — выбрать процессы пользователя.
Опции форматирования:
- -с — отображать информацию планировщика;
- -f — вывести максимум доступных данных, например, количество потоков;
- -F — аналогично -f, только выводит ещё больше данных;
- -l — длинный формат вывода;
- -j, (j) — вывести процессы в стиле Jobs, минимум информации;
- -M, (Z) — добавить информацию о безопасности;
- -o, (o) — позволяет определить свой формат вывода;
- —sort, (k) — выполнять сортировку по указанной колонке;
- -L, (H)- отображать потоки процессов в колонках LWP и NLWP;
- -m, (m) — вывести потоки после процесса;
- -V, (V) — вывести информацию о версии;
- -H — отображать дерево процессов;
Теперь, когда вы знаете синтаксис и опции, можно перейти ближе к практике. Чтобы просто посмотреть процессы в текущей оболочке используется такая команда терминала ps:
Все процессы, кроме лидеров групп, в том же режиме отображения:
Все процессы, включая фоновые и лидеры групп:
Чтобы вывести больше информации о процессах используйте опцию -f:
При использовании опции -f команда выдает такие колонки:
- UID — пользователь, от имени которого запущен процесс;
- PID — идентификатор процесса;
- PPID — идентификатор родительского процесса;
- C — процент времени CPU, используемого процессом;
- STIME — время запуска процесса;
- TTY — терминал, из которого запущен процесс;
- TIME — общее время процессора, затраченное на выполнение процессора;
- CMD — команда запуска процессора;
- LWP — показывает потоки процессора;
- PRI — приоритет процесса.
Например, также можно вывести подробную информацию обо всех процессах:
Больше информации можно получить, использовав опцию -F:
Эта опция добавляет такие колонки:
- SZ — это размер процесса в памяти;
- RSS — реальный размер процесса в памяти;
- PSR — ядро процессора, на котором выполняется процесс.
Если вы хотите получить еще больше информации, используйте вместо -f опцию -l:
Эта опция добавляет отображение таких колонок:
- F — флаги, ассоциированные с этим процессом;
- S — состояние процесса;
- PRI — приоритет процесса в планировщике ядра Linux;
- NI — рекомендованный приоритет процесса, можно менять;
- ADDR — адрес процесса в памяти;
- WCHAN — название функции ядра, из-за которой процесс находится в режиме ожидания.
Дальше мы можем отобрать все процессы, запущенные от имени определенного пользователя:
С помощью опции -H можно отобразить дерево процессов:
Если вас интересует информация только об определенном процессе, то вы можете использовать опцию -p и указать PID процесса:
Через запятую можно указать несколько PID:
Опция -С позволяет фильтровать процессы по имени, например, выберем только процессы chrome:
Дальше можно использовать опцию -L чтобы отобразить информацию о процессах:
Очень интересно то, с помощью опции -o можно настроить форматирование вывода, например, вы можете вывести только pid процесса и команду:
Вы можете выбрать такие колонки для отображения: pcpu, pmem, args, comm, cputime, pid, gid, lwp, rss, start, user, vsize, priority. Для удобства просмотра можно отсортировать вывод программы по нужной колонке, например, просмотр процессов, которые используют больше всего памяти:
Или по проценту загрузки cpu:
Ещё одна опция — -M, которая позволяет вывести информацию про права безопасности и флаги SELinux для процессов:
Общее количество запущенных процессов Linux можно узнать командой:
Мы рассмотрели все основные возможности утилиты ps. Дальше вы можете поэкспериментировать с её параметрами и опциями чтобы найти нужные комбинации, также можно попытаться применить опции BSD.
Проверка используемой памяти
Запустив smem из под непривилегированного пользователя, утилита покажет использование памяти всех процессов, запущенных данным пользователем, отсортированных от меньшего к большему по признаку PSS.
По умолчанию, вывод программы содержит 7 колонок: ID процесса, имя пользователя, команда запуска процесса, количество памяти раздела подкачки, USS, PSS и RSS.
RSS
RSS (размер резидентного набора) — общий объём памяти для процесса. Он включает в себя память, выделенную для общих библиотек, используемых процессом, хотя общие библиотеки могут быть использованы разными процессами,которые загружаются в память только один раз. В следствии этого, RSS — это не точное представление о памяти, используемое процессом.
PSS
PSS (пропорциональный размер памяти) разделяет память, выделенную в общую библиотеку среди других процессов, использующих её. Следовательно, если библиотеку используют 3 процесса, которая использует 60 страниц, то размер PSS будет составлять треть этого размере, т. е. 20 страниц на каждый процесс. Обычно, общий размер PSS составляет размер общей памяти системы. Однако, когда процесс, который разделяет библиотеку убит, PSS не равен общей памяти системы.
USS
USS (уникальный размер набора) относится к общей уникальной памяти процесса. Этот параметр не включает в себя память с общих библиотек. Когда процесс будет убит, USS размер USS будет равен размеру фактической памяти, которая будет освобождена. Таким образом, параметр USS лучше всего отображает состояние памяти, если Вы хотите посмотреть процесс, у которого возможна утечка памяти.
Так же запуск smem от пользователя root позволяет посмотреть процессы всех пользователей.
Как дать пользователю возможности cap_sys_admin
cap_sys_admin для su-пользователей CentOS 6/7
# vi /etc/security/capability.conf cap_sys_admin testuser
Далее подключаем PAM-модуль (Pluggable Authentication Modules)
ВНИМАНИЕ! Строка подключения должна быть перед строкой подключения !
# vi /etc/pam.d/su #%PAM-1.0 auth optional pam_cap.so auth sufficient pam_rootok.so ... ...
Авторизируемся с помощью su, проверяем capabilities для текущего пользователя:
$ su - testuser $ capsh --print Current: = cap_sys_admin+i Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,35,36 Securebits: 000x01b0 secure-noroot: no (unlocked) secure-no-suid-fixup: no (unlocked) secure-keep-caps: no (unlocked) uid=1001(testuser) gid=1001(testuser) groups=1001(testuser)
Отображение при помощи параметра -l имени команды и ее аргументов
По умолчанию, pidstat отображает только имя команды. т.е. без полного пути команды и ее аргументов. Например, в столбце команды, вы увидите только слово «java» (которое является лишь именем программы).
$ pidstat -C java Linux 3.0.101-0.7.17-default (thegeekstuff) 07/30/14 _x86_64_ 11:00:25 PID %usr %system %guest %CPU CPU Command 11:00:25 3288 0.04 0.03 0.00 0.07 0 java 11:00:25 17861 0.03 0.02 0.00 0.05 6 java
Однако, когда вы используете параметр -l, то будет отображен полный путь к команде и все ее аргументы, например, так, как это показано ниже.
$ pidstat -C java -l Linux 3.0.101-0.7.17-default (thegeekstuff) 07/30/14 _x86_64_ 11:00:31 PID %usr %system %guest %CPU CPU Command 11:00:31 3288 0.04 0.03 0.00 0.07 0 /usr/bin/java -Djava.util.logging.config.file=/home/tomcat/apache-tomcat-7.0.56/conf/logging.properties 11:00:31 17861 0.03 0.02 0.00 0.05 6 java -jar /home/rabbit/myapp.jar /home/app/conf/myapp.conf
Для того, чтобы получать для задач статистику через определенные интервалы времени, просто укажите то количество секунд, через которое вы хотите получать такую статистику,
# pidstat -p 23493 1 Linux 3.0.101-0.7.17-default (thegeekstuff) 07/30/14 _x86_64_ 06:25:50 PID %usr %system %guest %CPU CPU Command 06:25:51 23493 0.00 0.00 0.00 0.00 0 mysqld 06:25:52 23493 0.00 0.00 0.00 0.00 0 mysqld
Как видно из приведенного выше примера, статистика процесса mysqld будет выдаваться каждую секунду.
Вы также можете с помощью команды top получить идентификаторы нескольких процессов, а затем через регулярные интервалы просмотреть их здесь с тем, чтобы понять, как они используют системные ресурсы.
Gnome System Monitor
Ну и список утилит мониторинга процессов был бы не полным без упоминания Gnome System Monitor. Это тоже самое но с графическим интерфейсом. (если у тебя KDE то там KDE System Guard).
Запустить его можно либо выбрав в меню, либо написав в терминале:
В меню можно выбрать что именно мы сейчас хотим видеть. Либо активные процессы, либо вообще все процессы, ну или процессы текущего пользователя. Также можно включить отображение дерева процессов. Отдельно есть вкладка для мониторинга использования ресурсов компьютера. Если в меню нажать «Поиск открытых файлов» то можно увидеть какие файлы какими процессами используются.
На этом, в принципе, первую часть рассказа про процессы можно заканчивать. Теперь ты знаешь что такое процессы в Linux и как их находить. Осталось только научится их контролировать. И именно этим мы займёмся в следующей статье на эту тему. А точнее разберем жизненный цикл процесса, узнаем про сигналы, приоритеты, разберемся с системными процессами и потоками ядра, а также научимся этим всем управлять. А потому не забывай возвращаться к нам.
Твой Pulse.
Выдача статистики для ВСЕХ работающих процессов (или конкретного процесса)
Используйте параметр -p ALL для того, чтобы просмотреть статистику всех запущенных процессов так, как это показано ниже.
По умолчанию здесь будет отображаться загрузка процессора. Но, вы можете изменить эту статистику и получать любые другие статистические данные о производительности так, как это показано в следующих примерах.
# pidstat -p ALL | wc -l 165 # pidstat -p ALL | head Linux 3.0.101-0.7.17-default (thegeekstuff) 07/30/14 _x86_64_ 05:00:03 PID %usr %system %guest %CPU CPU Command 05:00:03 1 0.00 0.00 0.00 0.00 0 init 05:00:03 2 0.00 0.00 0.00 0.00 0 kthreadd 05:00:03 3 0.00 0.00 0.00 0.00 0 ksoftirqd/0 05:00:03 6 0.00 0.00 0.00 0.00 0 migration/0 05:00:03 7 0.00 0.00 0.00 0.00 0 watchdog/0 05:00:03 8 0.00 0.00 0.00 0.00 0 cpuset 05:00:03 9 0.00 0.00 0.00 0.00 0 khelper
Используйте параметр -p PID для того, чтобы контролировать статистику производительности конкретного процесса так, как это показано ниже.
# pidstat -p 13203 Linux 3.0.101-0.7.17-default (thegeekstuff) 07/30/14 _x86_64_ 05:04:29 PID %usr %system %guest %CPU CPU Command 05:04:29 13203 0.00 0.00 0.00 0.00 0 vim
Если вы новичок в использовании пакета systat, то вам потребуется также понимать как с помощью команды sar выдаются статистические данные, относящиеся к производительности.
Визуализация использования памяти
Как правило, визуализированные отчёты читать проще, чем вывод консоли. Используя smem Вы легко можете построить круговую диаграмму или гистограмму использования памяти.
Чтобы построить гистограмму для PSS, USS и RSS текущего пользователя, достаточно воспользоваться следующей командой:
Для того, чтобы построить круговую диаграмму, воспользуйтесь следующей командой:
Для постройки круговой диаграммы RSS с именем программ воспользуйтесь следующей командой:
Использование smem поможет Вам легко просматривать используемую приложениями и процессами память на Вашем компьютере, строя полезные графики, ведь как говориться, картина стоит тысячи слов.
На этом всё. Делитесь комментариями, подписывайтесь на наши новости и оставайтесь с нами.
Особенности управления памятью в Linux
Когда происходит обращение к страницам памяти, которые некоторое или долгое время не использовалис, т. е. к «неактивным» страницам. То ядро выполняет с ними несколько важных задач:
- возвращает ссылки на эти страницы в соответствующей таблице страниц;
- сбрасывает в нулевое значение время «неиспользования» этих страниц;
- помечает эти страницы как «активные».
Со страницами, находящимися в виртуальной памяти не всё так однозначно. Дело в том, что для того, чтобы «активизировать» такие страницы, они должны быть предварительно прочитаны с диска.
Системное ядро комплектуется специализированными модулями. Которые содержат алгоритмы и даже целые технологии. С помощью которых система довольно эффективно «предсказывает», сколько может потребоваться памяти при разной степени активности и загруженности процессов. Эти алгоритмы имеют своей целью обеспечение процессов свободной памятью с максимальной эффективностью. Т. е. так, чтобы процессам как можно реже приходилось простаивать в «ожидании» выгрузки очередной страницы в свободную память. Таким образом, наблюдая за состоянием страничного обмена во время рабочей нагрузки системы, можно делать выводы о том, нужна ли ей дополнительная память. Если страничный обмен интенсивный — то однозначно следует установить дополнительные модули ОЗУ.
Если же происходит так, что процессам не хватает ни реальной физической, ни виртуальной памяти. Т. е. когда память полностью исчерпана, то система начинает завершать (а точнее уничтожать) целые процессы. Либо запрещает создание новых. Конечно в этом случае в первую очередь уничтожаются наиболее «безболезненные» для системы процессы. Однако в таких случаях даже «на глаз» и по собственным ощущениям видно что она большую часть времени тратит на управление памятью, а не на выполнение рабочих задач.
В Linux можно настроить параметр, который задаёт, насколько быстро ядро должно «отбирать»страницы памяти у процессов. Которым они менее нужны для процессов, которым они на данный момент необходимы. Этот параметр содержится в файле /proc/sys/vm/swappiness и по-умолчанию равен 60. Если задать его меньшим значением (например 0). То ядро будет забирать страницы процесса в самую последнюю очередь. Используя вместо этого любые другие варианты. Если это значение в пределах между 60 и 100. То страницы будут отбираться у процессов с более высокой вероятностью. Вариант с изменением данного параметра на самом деле говорит о том, что необходимо либо снизить нагрузку на систему. Адаптировав её для других менее производительных задач, либо увеличить объём ОЗУ.
VSZ and RSS Linux memory
Что такое VSZ и RSS? Ответ нам даст :VSZ — virtual memory size; RSS — resident set size, the non-swapped physical memory that a task has used (in kiloBytes).
$ man ps|grep -A 3 VSZ ... STANDARD FORMAT SPECIFIERS ... vsz VSZ virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize). $ man ps|grep -A 3 RSS The SIZE and RSS fields dont count some parts of a process including the page tables, kernel stack, struct thread_info, and struct task_struct. This is usually at least 20 KiB of memory that is always resident. SIZE is the virtual size of the process (code+data+stack). -- rss RSS resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz).
Короче:
- VSZ — виртуально выделенная память, но не означает, что вся она используется. Кто в теме, тот в курсе, что Linux на запрос приложения перевыделяет (overcommitting) памяти больше, чем есть в наличии — прямо как американцы печатают баксов больше, чем фактически обеспечено золотовалютным резервом;
- RSS — фактически занимаемый в данный момент размер оперативки без учёта страниц перемещённых в swap.
Потребление памяти
Суммарное распределение страниц памяти по сегментам процесса можно получить при помощи третьего набора столбцов (активировав его клавишами № команды top, как показано в листинге ниже. В столбце VIRT изображается суммарный объем (в килобайтах) всех страниц процесса, а в столбце RES — объем резидентных «страниц (находящихся в страничных кадрах оперативной памяти). В столбце SWAP указывается объем всех страниц, находящихся во вторичной памяти — как «анонимных» страниц, выгруженных в специальную область подкачки, так и «файловых» страниц, возможно, никогда не загружавшихся в оперативную память.
Столбцы CODE и DATA показывают объемы (в килобайтах) памяти,, выделенной, под сегменты кода и данных, а столбец SHR — объем резидентных страниц, которые используются (или могут быть использованы) совместно с другими процессами.
Распределение памяти по назначению
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 8.6%us, 2.4%sy, 0.0%ni, 88.6%id, 0.4%wa, 0.0%hi, 0.0%si, 0.0%si
Mem: 8192144k total, 7037720k used, 1154424k free, 238984k buffers
Swap: 4104188k total, 35376k used, 4068812k free, 4356372k cached
PID %МЕМ VIRT SWAP RES CODE DATA SHR nFLT nDRT S PR NI %CPU COMMAND
26958 0.1 10288 4936 5352 880 3852 1544 0 0 S 20 0 0 bash
Механизм отображения считывает содержимое файла в страничные кадры только один раз, вне зависимости от количества процессов, отображающих этот файл в свою память. В случае отображения одного файла разными процессами их страницы совместно отображаются на одни и те же страничные кадры, за исключением страниц, скопированных (согласно принципу COW) при изменении.
Такое поведение механизма отображения позволяет эффективно использовать оперативную память за счет использования разными программами одинаковых разделяемых библиотек. Так как ELF-файлы библиотек «загружаются* в память процессов при помощи отображения mmap, то в результате каждая библиотека размещается в оперативной памяти лишь единожды, вне зависимости от количества ее «использований».
Интегральная статистика по использованию виртуальной памяти может быть получена при помощи команды free, как показано в листинге ниже.
Статистика использования памяти
Строка Mem: содержит статистику использования оперативной памяти, а строка Swap: — статистику специальной области подкачки. В столбце total указан суммарный объем всех доступных страничных кадров, а в столбцах used и free — суммарные объемы использованных и свободных страничных кадров, соответственно.
В столбце cached указан объем страничного кэша (page cache), т. е. суммарный объем страничных кадров оперативной памяти, использованных под отображение файлов в память. Аналогично, в столбце buffers указывается объем буферного кэша, т. е. суммарный объем памяти, использованной ядром для кэширования «не-отображаемых» сущностей: метаданных файлов, дисковых блоков при прямом вводе-выводе на устройства и пр.
В столбцах used и free строки -/+ buffers/cache указываются объемы использованной и свободной памяти «за вычетом» страничного и буферного кэшей, т. е. «чистая» память, выделенная процессам по требованию под данные, сгенерированные в процессе работы.
В листинге ниже показан пример потребления памяти процессом текстового редактора vi при попытке редактирования громадного файла в 1 Гбайт. Процесс загружает файл целиком, в результате чего он целиком оказывается в резидентных страницах сегмента данных процесса, что естественным образом увеличивает «чистый» расход оперативной памяти системы. После принудительного завершения процесса при помощи команды kill память естественным образом высвобождается.
Потребление памяти процессами
pts/0
262144+0 записей получено
262144+0 записей отправлено
скопировано 1073741824 байта (1,1 GВ), 148,956 с, 7,2 МВ/с
-rw-r—r— 1 fitz fttz 1,0G дек. 3 12:26 big
pts/1
PID TTY STAT TIME COMMAND
20595 pts/1 S 0:00 -bash
21087 pts/1 R+ 0:00 \_ ps f
20437 pts/0 S 0:00 -bash
21085 pts/0 Rl+ 0:08 \_ vi big
total used free shared buffers cached
Mem: 8000 5687 2312 0 42 2709
-/+ buffers/cache: 2935 5065
Swap: 4007 0 4007
top — 21:14:43 up 3:56, 3 users, load average: 0.53, 0.40, 0.47
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 6.0%us, 5.89%sy, 0.2%ni, 83.7%id, 4.3%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8192144k total, 5826856k used, 2365288k free, 43932k buffers
Swap: 4104188k total, 0k used, 4104188k free, 2777504k cached
PID %МЕМ VIRT SWAP RES CODE DATA SHR nFLT nDRT S PR NI %CPU COMMAND
21085 21.8 1783m 39m 1.7g 2148 1.7g 5676 0 0 S 20 0 0 vi
total used free shared buffers cached
Mem: 8000 3945 4054 0 42 2709
-/+ buffers/cache: 1193 6806
Swap: 4007 0 4007
Значение для admin_reserve_kbytes
Отметим, что многие описания параметров в документации ядра не только являются не полными, но даже вводят в заблуждение, вот например: «admin_reserve_kbytes defaults to min(3% of free pages, 8MB)«, — 3% от свободных страниц, не объёма, а именно страниц (4 кб страница)? А, что это за 8MB?
Значение admin_reserve_kbytes по-умолчанию
Вот, пожалуйста, не у одного меня возник подобный вопрос на данную тему:
documentation — What’s the default value of the admin_reserve_kbytes kernel parameter? — Unix & Linux Stack Exchange
На машине с Debian Stretch где «MemTotal: 250400 kB» и составило
Однако на другой машине с той же ОС Debian Stretch где «MemTotal: 5083092 kB» и составило
Возможно в других ОС и/или версиях ядра иная ситуация со значением admin_reserve_kbytes по-умолчанию и зависит от реализации функции , а также иных функций ею вызываемых и т.п.: https://elixir.bootlin.com/linux/v5.0/source/mm/mmap.c#L3666
Таким образом, admin_reserve_kbytes:
defaults = как-то в расброс… То, 3% от RAM (без учёта свопа), то 8MB, а бывает и 7616 кб (Ой как бывает! Всё так зыбко и условно: https://www.youtube.com/watch?v=Ta4G51ZMZRM).
Если значение не указано явно, то по-умолчанию может быть равно 3% (без учёта пространства подкачки страниц), и как видим не факт, что 8 МБ будет минимумом даже если 3% до 8 МБ не дотягивает, — короче, как повезёт. Если не хочется гадать, установи его явно.
Оптимальное значение для admin_reserve_kbytes
Если у нас нет удалённого доступа к нашей машине и соответственно пользователей с cap_sys_admin, , то вполне будет достаточно символического 1 кб sysctl -w vm.admin_reserve_kbytes=1, — проверено, с таким значением ничто не загнулось, не взорвалось, ничего страшного не произошло.
А для нахождения оптимального значения admin_reserve_kbytes на удалённом сервере смотрим VmSize (virtual memory size: ) + VmRSS из , для всех основных программ с которыми мы удалённо будем работать, например:
# cat /proc/PID/status|less Name: sshd State: S (sleeping) Tgid: 20532 Pid: 20532 PPid: 1 TracerPid: Uid: Gid: Utrace: FDSize: 64 Groups: VmPeak: 87872 kB VmSize: 87868 kB VmLck: kB VmHWM: 1560 kB VmRSS: 584 kB VmData: 8596 kB VmStk: 88 kB VmExe: 552 kB VmLib: 8444 kB VmPTE: 168 kB VmSwap: 868 kB Threads: 1