Еще один вопрос о памяти на Solaris 10.
А верхняя показывает, что у меня 672 МБ свободной памяти:
130 processes: 126 sleeping, 2 zombie, 2 on cpu
CPU states: 95.1% idle, 3.9% user, 1.0% kernel, 0.0% iowait, 0.0% swap
Memory: 16G phys mem, 672M free mem, 2048M total swap, 2023M free swap
А vmstat показывает мне то же самое:
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr rm s0 s1 s2 in sy cs us sy id
0 0 0 564744 687896 3 13 0 0 0 0 0 0 0 0 0 354 667 752 1 1 98
Но когда я делаю prstat -a -s размер Я получаю это:
NPROC USERNAME SWAP RSS MEMORY TIME CPU
45 orbixadm 1449M 1592M 9.7% 4:46:53 0.4%
48 root 146M 160M 1.0% 8:09:49 1.2%
3 user1 46M 204M 1.2% 0:00:45 0.0%
9 webservd 46M 14M 0.1% 0:00:00 0.0%
5 ctxsrvr 28M 32M 0.2% 4:54:51 0.0%
11 user2 23M 34M 0.2% 0:00:37 0.2%
4 user3 4840K 11M 0.1% 0:00:01 0.0%
1 smmsp 1456K 4552K 0.0% 0:00:24 0.0%
2 daemon 2128K 6224K 0.0% 0:06:32 0.0%
1 user4 1232K 3608K 0.0% 0:00:00 0.0%
1 nagios 376K 2472K 0.0% 0:15:18 0.0%
и, как видите, сумма значений RSS не достигает 15 ГБ памяти, и даже если я добавлю к нему значения SWAP.
Итак, мой вопрос: какой команде я верю?
Если top и vmstat дают хороший результат, где мои 15 ГБ используемой памяти? Если нет, то почему они мне это показывают?
Изменить: результат для команды: % echo ::memstat | mdb -k
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 1687138 13180 82%
Anon 137110 1071 7%
Exec and libs 47107 368 2%
Page cache 95277 744 5%
Free (cachelist) 22248 173 1%
Free (freelist) 69592 543 3%
Total 2058472 16081
Physical 2055442 16058
Изменить 2:
Хорошо, теперь я могу видеть память, используемую кешем ARC.
Но с некоторыми новыми тестами теперь у меня есть:
2066 MB used
(prstat -Z и echo :: memstat | mdb -k результат)
1193 MB free
(верхняя результат)
8859 MB ARC cache
(kstat zfs :: arcstats: size результат)
Что дает нам более или менее 12 GB
памяти, в то время как моя система 16 GB
.
Может я что-то еще пропустил, но где другие 4 GB
?
ZFS, вероятно, использует большую часть вашей памяти в качестве кеша ARC. Если вы хотите узнать, как используется ваша оперативная память, выполните эту команду от имени пользователя root:
# echo ::memstat | mdb -k
В Solaris 10 10/09 и новее это отображается примерно так:
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 60569 236 16%
ZFS File Data 53270 208 14%
Anon 41305 161 11%
Exec and libs 5891 23 2%
Page cache 1190 4 0%
Free (cachelist) 7006 27 2%
Free (freelist) 212607 830 56%
Total 381838 1491
Как видите, есть строка, в которой указано, сколько оперативной памяти используется для кеширования данных файла ZFS. К сожалению, вы используете более старую версию Solaris 10, поэтому memstat не показывает эту статистику ZFS отдельно. Он включен в используемую память ядра, что сбивает с толку. В обычных условиях ядро не должно использовать 13 ГБ ОЗУ.
В любом случае, все еще есть способ отобразить полный размер ARC на вашем сервере.
Просто запустите эту команду:
# kstat zfs::arcstats:size
module: zfs instance: 0
name: arcstats class: misc
size 273469024
Это показывает, что на моей машине 273 МБ ОЗУ в настоящее время используются для обработки кеша ZFS ARC. memstat показывает, что из этих 273 МБ 208 МБ используются как файловый кеш. До этих 208 МБ ОЗУ можно автоматически освобождать по запросу, если это потребуется приложениям.
Теперь давайте посмотрим на использование памяти процессами. Если вы используете параметр -Z с prstat, он показывает сводку по зонам под статистикой по процессам. Здесь глобальная (и единственная) зона использует 185 МБ ОЗУ. Это должно (примерно) соответствовать сумме всех процессов в столбце rss.
# prstat -Z
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
741 noaccess 129M 113M sleep 59 0 0:00:35 1,4% java/18
973 root 5148K 832K run 29 0 0:00:00 0,4% script/1
972 root 5072K 900K sleep 59 0 0:00:00 0,2% script/1
998 root 7148K 2812K cpu0 49 0 0:00:00 0,1% prstat/1
974 root 3456K 968K sleep 49 0 0:00:00 0,1% ksh/1
5 root 0K 0K sleep 99 -20 0:00:01 0,1% zpool-rpool/37
241 root 5400K 1608K sleep 59 0 0:00:00 0,0% VBoxService/5
77 root 7620K 2356K sleep 59 0 0:00:00 0,0% devfsadm/7
969 root 3372K 936K sleep 59 0 0:00:00 0,0% script/1
126 root 9664K 2844K sleep 59 0 0:00:00 0,0% nscd/31
480 root 9420K 2036K sleep 59 0 0:00:00 0,0% sendmail/1
11 root 9164K 7860K sleep 59 0 0:00:29 0,0% svc.configd/17
1 root 2504K 1432K sleep 59 0 0:00:00 0,0% init/1
413 root 15M 9644K sleep 59 0 0:00:00 0,0% fmd/19
377 root 6536K 2848K sleep 59 0 0:00:02 0,0% inetd/4
ZONEID NPROC SWAP RSS MEMORY TIME CPU ZONE
0 48 177M 185M 12% 0:01:24 2,5% global
Эти 185 МБ соответствуют сумме двух строк в выводе memstat: «Anon» - это ОЗУ, используемая приложениями для хранения данных, и «Exec and libs» - это код приложений и их библиотек.
Память заполнена неотображенными страницами данных, считанных с диска. Он хранится в памяти, потому что эти файлы могут быть прочитаны снова, и сохранение данных в памяти сохраняет чтение с диска. Свободная память навсегда тратится впустую, поэтому компьютер пытается сохранить ее как можно меньше.
Например, скажем, вы запускаете программу. Программа завершается. Программа все еще находится в памяти, но эти страницы памяти не используются никаким процессом, поскольку программа не запущена. Если система не испытывает нехватки памяти, страницы сохраняются в памяти. Если программа запускается снова, это сэкономит усилия, чтобы освободить ее, просто чтобы выделить больше памяти для программы, а затем снова прочитать ее. И если страницы нужны для чего-то еще, это все равно победа для системы, потому что легче переместить страницу памяти напрямую из использования в другую, чем освободить ее только для того, чтобы снова использовать.
Память не является ресурсом для экономии. Если вы оставите 1 ГБ свободным на час, все, что вы могли бы сделать с этими данными, будет потеряно навсегда.