Вычисление использования памяти и загрузки ЦП

Module.symvers (ре), сгенерированное когда Вы (ре) модули компиляции. Выполненный make modules, и необходимо получить a Module.symvers файл в корне дерева ядра.

Обратите внимание на это, если Вы только работали make и нет make modules, Вы еще не создали модулей. Символы от самого ядра (vmlinux или один из архитектурно-зависимых форматов изображения), находятся в System.map.

4
23.04.2011, 08:49
2 ответа

ps самый простой интерфейс к информации в /proc.

Вот один способ перечислить на пользовательскую память:

$ ps -e -o uid,vsz | awk '
{ usage[$1] += $2 }
END { for (uid in usage) { print uid, ":", usage[uid] } }'

Если бы Вы действительно хотите использовать proc, я предложил бы использовать что-то как Python или Perl для итерации однажды /proc/*/status, и сохраните пару ключ/значение пользователя/использования в хеше.

Соответствующие поля /proc/PID/status кажись, быть:

Uid:    500     500     500     500
VmSize:     1234 kB

Я думаю, что четыре цифры Uid являются реальным uid, эффективным uid, сохранил uid, и фс uid.

Принятие Вас хочет реальный uid, что-то вроде этого должно работать:

# print uid and the total memory (including virtual memory) in use by that user
# TODO add error handling, e.g. not Linux, values not in kB, values not ints, etc.

import os
import sys
import glob

# uid=>vsz in KB
usermem = {}

# obtain information from Linux /proc file system
# http://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html
os.chdir('/proc')
for file in glob.glob('[0-9]*'):
    with open(os.path.join(file, 'status')) as status:
        uid = None
        mem = None
        for line in status:
            if line.startswith('Uid:'):
                label, ruid, euid, suid, fsuid = line.split()
                uid = int(ruid)
            elif line.startswith('VmSize:'):
                label, value, units = line.split()
                mem = int(value)
        if uid and mem:
            if uid not in usermem:
                usermem[uid] = 0
            usermem[uid] += mem

for uid in usermem:
    print '%d:%d' % (uid,usermem[uid])

ЦП намного более тверд.

PS (1) страница справочника говорит:

   CPU usage is currently expressed as the percentage of time spent
   running during the entire lifetime of a process. This is not ideal,
   and it does not conform to the standards that ps otherwise conforms to.
   CPU usage is unlikely to add up to exactly 100%.

Таким образом, я не уверен. Возможно, посмотрите на top видеть, как это обрабатывает его. Или Вы могли работать ps -e -o uid,pid,elapsed дважды в данном интервале, и вычитают эти два раза, или что-то.

Или установите что-то, что это лучше с этой целью, таково как учет процесса.

1
27.01.2020, 21:02
  • 1
    Большой... никогда не знал ps мог сделать эти вещи :) –  Barun 23.04.2011, 10:49
  • 2
    большое спасибо....., я запустил скрипт, отправленный Вами..., он дает мне память, используемую пользователем, но когда я вычислил то же самое с утилитой, названной smem результаты, отличался. Команда, которую я использовал, была "smem-u" согласно странице справочника smem, это дает мне память, используемую пользователем. Я хочу знать, почему существует различие в выводе, сгенерированном двумя. Я был бы действительно обязан. –  nishan 27.04.2011, 06:44
  • 3
    @nishan: smem домашняя страница объясняет это. Короче говоря: это зависит от того, как Вы считаете виртуальную память и совместно использованные библиотеки. Читайте о vsz по сравнению с RSS по сравнению с pss для деталей. –  Mikel 27.04.2011, 07:42

Можно проверить /proc/meminfo файл:

cat /proc/meminfo | head -2
MemTotal:        2026816 kB
MemFree:          377524 kB

Используя вышеупомянутые две записи можно вычислить, сколько памяти используется в данный момент:

cat /proc/meminfo | head -2 | awk 'NR == 1 { total = $2 } NR == 2 { free = $2 } END { print total, free, total - free }'
0
27.01.2020, 21:02

Теги

Похожие вопросы