Назад | Перейти на главную страницу

Использование подкачки процессов Linux больше, чем общее использование подкачки системы

У меня странная проблема, когда я бегу верхняя Команда показывает, что некоторые процессы используют около 1,5 ГБ пространства подкачки, но тогда общее использование подкачки системы меньше, примерно до 117 МБ, так почему? Я думал, что общее использование системного свопа - это совокупное использование всех процессов, что в данном случае не похоже на правду. Вот результат:

Tasks: 392 total,  16 running, 373 sleeping,   0 stopped,   3 zombie
Cpu0  : 95.1%us,  4.9%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  : 98.0%us,  2.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  : 91.1%us,  6.9%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  2.0%si,  0.0%st
Cpu3  : 95.0%us,  3.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  2.0%si,  0.0%st
Mem:   4148160k total,  4007820k used,   140340k free,    15968k buffers
Swap:  4096552k total,   117584k used,  3978968k free,  2909396k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND                                                                                                          
 5784 apache    18   0 1567m 5772 4568 S  0.0  0.1   0:00.03 1.5g C:\windows\system32\explorer.exe /desktop                                                                         
 5776 apache    25   0 1558m 2564 2124 S  0.0  0.1   0:00.00 1.5g C:\windows\system32\winedevice.exe MountMgr                                                                        5774 apache    25   0 1558m 2324 1928 S  0.0  0.1   0:00.00 1.5g C:\windows\system32\services.exe                                                                                  
 9395 apache    15   0 90536 2988 1340 S  0.0  0.1   0:00.00  85m /usr/sbin/httpd                                                                                                   
 9419 apache    18   0 90536 2988 1340 S  0.0  0.1   0:00.00  85m /usr/sbin/httpd                                                                                                   
27016 apache    18   0 91520 4000 2964 S  0.0  0.1   0:00.04  85m /usr/sbin/httpd                                                                                                   
 7773 apache    16   0 91012 3592 1464 S  0.0  0.1   0:07.04  85m /usr/sbin/httpd   

Top (по крайней мере, в некоторых версиях) вычисляет SWAP для каждого процесса как VIRT - RSS вместо того, чтобы сообщать о реальном использовании свопа. Под Linux результат - совершенно бессмысленное число.

Короткий ответ

Столбец SWAP в topвычисление (примерно) использование процесса подкачки и любой сопоставленный файл и / или общие объекты, используемые этим процессом. Сопоставленные файлы не являются частью замена, это файлы, считываемые процессом определенным образом, а общие объекты - это динамические библиотеки (.so) или блоки памяти, совместно используемые процессами.

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

На странице руководства сказано: "SWAP рассчитывается путем вычитания физическая память из виртуальная память". На вычисленное значение не следует полагаться, если вы не разработчик (и не знаете, что делаете), для случайных пользователей это не имеет реального значения, см. Ниже, почему.

Длинный ответ, что такое виртуальная память и отображаемые файлы?

Примечание. VIRT означает виртуальную память.

Виртуальная память процесса Linux

Каждому процессу в Linux (и это тоже похоже на многие системы Unix) выделяется виртуальное адресное пространство. В 32-битной системе это виртуальное адресное пространство составляет до 4 ГиБ (2 ^ 32). В 64-битной системе. это виртуальное адресное пространство до 256 ТиБ (2 ^ 48 да, 64-битная базовая система с текущим расширением AMD64 или 64-битным Intel может только адрес 48 бит памяти).

Виртуальная память каждого процесса содержит пространство ядра и пространство пользователя. В 32-битной системе разбиение зависит от того, активирован PAE или нет, поэтому он может быть 3 ГБ / 1 ГБ или 2 ГБ / 2 ГБ. На 64-битной системе это всегда (AFAIK) половина / половина, поэтому первые 47 бит (128 ТиБ) предназначены для пользовательского пространства, а в конце 64-битной области 128 ТиБ зарезервировано для ядра.

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

Дополнительная информация о сопоставленных файлах

Можно сопоставить файлы, размер которых превышает доступную память, поэтому размер VIRT может быть больше, чем объем памяти. Ядро достаточно умен, чтобы загружать / выгружать данные из хранилища в память, чтобы ускорить ввод-вывод настолько, насколько позволяет доступная физическая свободная RAM.

Вам как пользователю не нужно заботиться о размере VIRT. Это в основном предназначено для разработчиков (жесткого ядра).

В заключение, столбец SWAP вычисляет виртуальную память минус физическая память (скорее всего, RSS), это, вероятно, будет включать в себя используемую часть подкачки и любой сопоставленный файл, который также находится на диске.