Размер процесса в UNIX

Как правильно получить размер процесса на Solaris, HP-UXи AIX? Должны ли мы использовать topps -o vszили что-то еще?

4 ответа

  1. Да, вы правы, чтобы заблокировать на VSZ.

    ps u даст вам VSZ и RSS, которые являются размером виртуальной памяти и размер резидентного набора. RSS — это объем физической памяти, выделенной процессу, а VSZ-размер виртуальной памяти процесса. Если у вас работает несколько копий программы, Большая часть памяти в VSZ будет разделена между этими процессами.

  2. Точные определенияvsize,rss,rprvt,rshrd, и других неясных на вид сокращений варьируются от ОС к ОС. Страницы руководства для команд topand psбудут иметь какое-то описание, но все такие описания значительно упрощены (или основаны на давно исчезнувших реализациях ядра).
    «Размер процесса» как понятие дьявольски трудно определить в общем случае. Ответы в конкретных случаях сильно зависят от фактической реализации управления памятью в ОС и редко так же удовлетворяют, как аккуратная концепция «размера процесса», которая существует в умах большинства пользователей (и большинства разработчиков).

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

  3. В Solaris с помощью команды можно получить подробную информацию об использовании памяти процессаpmap. В частности, pmap -x <pid>показывает, какая часть памяти процесса является общей и сколько конкретно используется этим процессом. Это полезно для разработки «маргинального» использования памяти процесса — с помощью этой техники вы можете избежать двойного счета общих библиотек.

  4. Я суммировал размер резидентного набора для всех процессов, подобных этому (как root):

    ps ax -o rss | awk '{rss += 
    	

    The exact definitions of vsize, rss, rprvt, rshrd, and other obscure-looking abbreviations vary from OS to OS. The manual pages for the top and ps commands will have some sort of description, but all such descriptions are simplified greatly (or are based on long-extinct kernel implementations).
    "Process size" as a concept is fiendishly difficult to pin down in the general case. Answers in specific instances depend heavily on the actual memory management implementation in the OS, and are rarely as satisfying as the tidy "process size" concept that exists in the minds of most users (and most developers).

    For example, none of those numbers (nor, likely, any combination of them) can be used to tell you exactly how many such processes can run at once in a given amount of free memory. But really, your best bet is to come at it from that end: why do you want this number, and what will you use it for? Given that information, I think you'll get more useful answers.

    On Solaris, you can get detailed information on a process's memory usage with the pmap command. In particular, pmap -x <pid> shows you how much of a process's memory is shared and how much is specifically used by that process. This is useful for working out the "marginal" memory usage of a process -- with this technique you can avoid double-counting shared libraries.

    Yes, you are right to lock at the VSZ.

    ps u will give you the VSZ and RSS, which are the virtual memory size and resident set size. The RSS is how much physical memory has been allocated to the process, and the VSZ is the virtual memory size of the process. If you have several copies of a program running, a lot of the memory in the VSZ will be shared between those processes.

    I summed up the resident set size for all processes like this (as root):

    ps ax -o rss | awk '{rss += $1;} END { print rss}'
    

    ;} END { print rss}'