Используемая память на Solaris 10

10

Еще один вопрос о памяти на 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 дают хороший результат, где моя 15GB используемая память? Если нет, то почему они показывают мне это?

Изменить: результат для команды: % 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: размер результата)

Которые дают нам больше или меньше 12 GBпамяти, в то время как моя система имеет 16 GB.
Может быть, я что-то пропустил, но где другие 4 GB?

Джереми С.
источник
Пожалуйста, добавьте kstat zfs::arcstats:sizeвывод на ваш вопрос.
Jlliagre

Ответы:

12

ZFS, вероятно, использует большую часть вашей памяти в качестве кэша ARC. Если вы хотите узнать, как используется ваша RAM, запустите эту команду как 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» - это код приложений и их библиотек.

jlliagre
источник
Спасибо за ваш ответ тоже, результат команды не очень подробно, но есть необходимость посмотреть, что использует RAM.
Джереми С.
Можете ли вы добавить его вывод, обновив свой вопрос? Кстати, ответ, который вы приняли, на самом деле немного некорректен, поскольку несотображенные страницы в Solaris сообщаются как свободные ОЗУ, а не как используемые, что является проблемой, на которую вы жалуетесь.
Jlliagre
Вопрос отредактирован с помощью команды result. Вы правы, мои вопросы не полностью ответили. По крайней мере, мы видим, что свободная память одинакова с top и vmstat, чем с :: memstat . Но есть ли смысл детализировать, что используется каждым процессом?
Джереми С.
Какое обновление Solaris 10 вы используете (cat / etc / release) и используете ли вы ZFS?
Jlliagre
это Solaris 10 5/09, и да, я использую ZFS
Джереми С.
4

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

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

Память не является ресурсом, который можно сохранить. Если вы оставите 1 ГБ на час свободным, все, что вы могли бы сделать с этими данными, будет потеряно навсегда.

Дэвид Шварц
источник
Спасибо за этот хорошо объясненный ответ. Теперь я понимаю, почему на всех моих серверах Solaris используется более или менее 90% ОЗУ.
Джереми С.