3

В отличие от других операционных систем UNIX, в Linux-процессах обычно используется бессмысленный vmem по сравнению с резидентной памятью.

Например на моем ноутбуке

Использование плагина-контейнера в 20 раз больше vsz чем rss, lxterminal - в 40 раз больше vss чем rss

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
petanb    2036  1.7 39.8 2027260 743108 ?      Sl   Jul01 260:16 /usr/lib/firefox/firefox
petanb    2170  3.4  1.8 668460 33716 ?        Sl   Jul01 520:11 /usr/lib/firefox/plugin-container /usr/lib/flashplugin-installer/libflashplayer.so -gr
petanb    2391  0.0  0.7 698888 14080 ?        Dl   Jul01   7:02 /usr/bin/lxterminal
petanb    4633  0.0  0.4 430568  8816 ?        Sl   Jul01   0:08 /usr/lib/notify-osd/notify-osd

посмотрите на разницу между VSZ и RSS, почему это так? Я знаю, что виртуальная память больше, чем у резидента, но почему так много?

1 ответ1

5

Прежде всего, программы / процессы не "кушают" память. Они используют или выделяются памяти.

VSZ (размер виртуальной памяти в килобайтах) - это сумма всей виртуальной памяти, требуемой процессом. Этот размер является в первую очередь атрибутом процесса / программы, а не под контролем ОС.

RSS - это размер резидентного набора, который представляет собой объем физической памяти, выделенной для процесса. Это физическая память, используемая для хранения страниц виртуальной памяти, которые являются резидентными (а не расположены в резервном хранилище, т.е. выгружены) во время выполнения процесса. RSS будет меньше или равен размеру виртуальной памяти процесса.
Обратите внимание, что иногда RSS сообщается как число страниц (которое обычно имеет размер 4096 байт), а не в килобайтах. Поэтому в таких ситуациях сравнивать VSZ с RSS неуместно.

Обратите внимание, что оба этих размера для процесса могут включать в себя общие библиотеки, а также память для кода / текста, данных, кучи и стека. Операционная система должна планировать процессы и определять, какие страницы процесса остаются резидентными в (физической) памяти, а какие выгружаются. Общие библиотеки с большей вероятностью будут оставаться резидентными, чем страницы, используемые исключительно процессом. Процесс в спящем состоянии (например, STAT == D1 или STAT == S1) может выгружать большинство своих страниц и иметь небольшой RSS. Все под контролем ОС и динамики выполнения процесса.

Также обратите внимание, что Linux отличается от большинства других * nixes тем, что Linux (если не настроено иначе) будет перезапускать запросы на (виртуальную) память. Таким образом, даже если для процесса не выделены ни страницы, ни пространство подкачки (пока процесс не попытается получить доступ к этой "выделенной" памяти), его VSS может увеличиться.

Приложение: ответ на комментарий

почему разница такая огромная? иногда VSZ в 20 раз больше RSS, даже в системе без обмена.

Вы приводите конкретный пример без каких-либо подробностей.
Функция чрезмерной загрузки в Linux может стать фактором значительного расхождения между VSZ и RSS, если нет обмена. Эта программа выполняет malloc() больших, но неиспользуемых буферов?
Возможно, вам придется оценить использование памяти этим процессом самостоятельно, используя такие инструменты памяти, как pmap и top , которые предоставят немного больше деталей.

Смотрите "Runtime_Memory_Measurement" для получения дополнительной информации. top документация заявляет, что

SWAP -- Swapped size (kb)
            The swapped out portion of a task's total virtual memory image. 

RES -- Resident size (kb)
            The non-swapped physical memory a task has used.
            RES = CODE + DATA. 

VIRT -- Virtual Image (kb)
            The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out.
            VIRT = SWAP + RES 

Я не знаю, должны ли эти top определения учитывать виртуальную память, которая была выделена, но еще не распределена по физическим ресурсам. Я думаю, что это так, но уравнение VIRT было упрощено, исключив (необычную) ситуацию с выделением, но еще не распределенной виртуальной памяти.

Приложение 2: ответ на комментарий

Может быть, попробуйте запустить top или htop на своем компьютере, вы увидите, что есть ряд процессов, которые используют значительное количество VSZ и почти не RSS

Не увидел ничего интересного в моей системе Ubuntu:

  PID  PR  NI  VIRT  RES  SHR S %CPU %MEM SWAP CODE DATA nDRT COMMAND                                                                                        
26379  20   0 20812 7996 3496 S    4  0.4  12m    4 2828    0 gs                                                                                             
 1082  20   0 85292  46m  15m S    2  2.5  36m 1660  30m    0 Xorg                                                                                           
 2036  20   0 22948 8756 7148 S    1  0.4  13m   40  788    0 multiload-apple                                                                                
 2411  20   0 47984  19m  10m S    1  1.0  27m 1924 7584    0 python                                                                                         
   62  20   0     0    0    0 S    0  0.0    0    0    0    0 kondemand/0                                                                                    
  930  20   0  3236 1528  792 S    0  0.1 1708  284  820    0 dbus-daemon                                                                                    
 1618  20   0  6964 3084 2244 S    0  0.2 3880  420  836    0 cupsd                                                                                          
 1971  20   0 15708 3100 2484 S    0  0.2  12m  216  10m    0 udisks-daemon                                                                                  
 2037  20   0 39316  11m 9676 S    0  0.6  26m   76 1404    0 sensors-applet                                                                                 
25733  20   0  2568 1280  956 R    0  0.1 1288   64  480    0 top                                                                                            
 2473  20   0  6712 4060 1564 S    0  0.2 2652  780 2492    0 bash                                                                        

Для всех пользовательских процессов VIRT == SWAP + RES было истинным, а RES == CODE + DATA - нет.

У меня есть несколько SBCS под управлением Embedded Linux, но не имеют top поперечного скомпилирован для них. Глядя на /proc/<pid>/stat для процесса оболочки, есть VSZ = 580 КБ и RSS = 200 КБ (на самом деле 50 страниц), но, конечно, /proc/meminfo сообщает о нулевых байтах для подкачки. Может быть, получить top запуск на этом SBC может быть интересно (так как я не знаю, где top получает свои номера для обмена).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .