VSZ vs RSS память и пространство подкачки

Я пытаюсь понять использование памяти в крупномасштабной симуляции, которую мы пытаемся запустить. Когда я запускаю отчеты "ps"

USER    PID %CPU %MEM     VSZ    RSS TTY    STAT START   TIME COMMAND
myuser 5252 97.7  0.5 5751412 377392 ?      Rs   19:49   1:15 myprogram

В этой симуляции у нас есть три массива, каждый из которых занимает 1,6 ГБ (200 миллионов двойных значений). На основании информации в

Что такое RSS и VSZ в управлении памятью Linux

Я ожидал, что эта память будет указана в RSS, но RSS составляет всего 377 МБ. Основываясь на информации в потоке stackoverflow, я пришел к выводу, что память должна быть заменена, и посмотрел на «free -m»

             total       used       free     shared    buffers     cached
Mem:         64391       5985      58406          0        463       1295
-/+ buffers/cache:       4226      60164
Swap:         4766          0       4766

а своп вообще не используется! Кроме того, что он слишком мал в любом случае. Так откуда же взялась эта разница между RSS и VSZ? Почему массивы, которые мы выделяем, являются частью VSZ, а не частью RSS?

Я ценю любую помощь


person ftiaronsem    schedule 07.08.2015    source источник
comment
Действительно ли программа касалась (читала или записывала) записи в этом массиве? Процессу разрешено выделять столько памяти, сколько у него есть доступного адресного пространства, независимо от объема оперативной памяти/подкачки, доступной на машине. Фактическая память не выделяется процессу до тех пор, пока процесс фактически не коснется памяти. Если в это время ОС не имеет доступной памяти, то процесс мгновенно уничтожается. Попробуйте посмотреть VSIZE, также заставьте вашу программу установить для каждого из этих массивов определенное значение, например 0, сразу после выделения.   -  person joeking    schedule 07.08.2015
comment
Большое спасибо за ваш комментарий, который уже был действительно полезным. И вы правы, программа тогда еще не трогала эти массивы. И далее массивы инициализируются через цикл, который даже не касается всех элементов массива. Вы знаете, что в этом случае происходит с RSS и VSZ? Допустим, цикл зацикливается только на первой половине массива. Увеличится ли RSS только на 800 МБ? Это было бы невероятно полезно знать.   -  person ftiaronsem    schedule 07.08.2015


Ответы (1)


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

person incompetent    schedule 07.08.2015
comment
Большое спасибо за ваш ответ, он уже очень помог. Вы случайно не знаете что-нибудь о ситуации, которую я описал в своем ответе на шутливый комментарий? - person ftiaronsem; 07.08.2015
comment
@ftiaronsem вступает в игру подкачки, если вашей ОС удобно хранить все страницы в ОЗУ. RSS увеличится на 800 МБ, но, на мой взгляд, вы не можете предсказать это заранее. - person incompetent; 08.08.2015
comment
Конечно, RSS будет увеличиваться пропорционально объему доступного массива. Однако он размещается блоками размером со страницу. Я не знаю размер страницы в вашей системе, но, вероятно, 4 КБ или 8 КБ. (Это будет степень двойки). Коснитесь любого байта на странице размером 4 КБ, и вся страница будет зафиксирована в памяти (RSS). - person joeking; 09.08.2015
comment
@joeking содержит ли RSS страницы, присутствующие в области подкачки? - person incompetent; 09.08.2015
comment
см.: stackoverflow.com/questions/7880784/ - person joeking; 10.08.2015