Количественная оценка оперативной памяти, использование процессора процессом в C под Linux - PullRequest
4 голосов
/ 27 ноября 2010

Как узнать, сколько ОЗУ и ЦП "съедает" определенный процесс в Linux?А как узнать все запущенные процессы (включая демоны и системные)?=)

UPD: используется язык C

Ответы [ 2 ]

5 голосов
/ 27 ноября 2010

Используйте top или ps .

Например, ps aux перечислит все процессы вместе с их владельцем, состоянием, используемой памятью и т. Д.

РЕДАКТИРОВАТЬ: Чтобы сделать это с C под Linux, вам необходимо прочитать файлы процесса в файловой системе proc . Например, /proc/1/status содержит информацию о вашем init процессе (который всегда имеет PID 1):

char buf[512];
unsigned long vmsize;
const char *token = "VmSize:";
FILE *status = fopen("/proc/1/status", "r");
if (status != NULL) {
    while (fgets(buf, sizeof(buf), status)) {
        if (strncmp(buf, token, strlen(token)) == 0) {
            sscanf(buf, "%*s %lu", &vmsize);
            printf("The INIT process' VM size is %lu kilobytes.\n", vmsize);
            break;
        }
    }
    fclose(status);
}
2 голосов
/ 28 ноября 2010

Измерение того, сколько оперативной памяти использует процесс, практически невозможно.Сложность состоит в том, что каждый кусок оперативной памяти не используется ровно одним процессом, и не все оперативные памяти, которые использует процесс, фактически «принадлежат» ему.

Например, два процесса могут иметь общие отображенияодин и тот же файл, и в этом случае любые страницы, находящиеся в основном для отображения, будут «принадлежать» обоим процессам.Но что, если только один из этих процессов использовал его?

Личные страницы также можно копировать при записи, если процесс разветвлен или если они были отображены, но еще не использовались (рассмотрим случай, когдапроцесс имеет malloc'd огромную область, но еще не затронул большую ее часть).В этом случае, какой процесс «владеет» этими страницами?

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


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

Так есть ответ?Некоторые из них можно измерить, изучив структуры карт страниц, которые теперь доступны в / proc (/ proc / pid / pagemap), но не всегда существует тривиальный способ разделения «владения» общими страницами.

См. Документацию Linux / vm / pagemap.txt для обсуждения этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...