Определение размера памяти - PullRequest
1 голос
/ 11 ноября 2010

Я хотел бы иметь возможность перезапустить службу, когда она использует слишком много памяти (это связано с ошибкой в ​​сторонней библиотеке)

Я использовал это, чтобы ограничить объем памяти, который может быть запрошен:

resource.setrlimit(resource.RLIMIT_AS, (128*1024*1024, 128*1024*1024))

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

Я использую язык Python, но решение для любого языка программирования может быть переведено в код Python, при условии, что оно жизнеспособно и разумно в Linux.

Ответы [ 3 ]

1 голос
/ 12 ноября 2010

Это код, который я придумал.Кажется, работает должным образом и избегает слишком большого разбора строк.Имена переменных, которые я распаковываю, взяты из справочной страницы proc(5), и это, вероятно, лучший способ извлечения информации об ОС, чем разбор строк /proc/self/status.

def get_vsize():
    parts = open('/proc/self/stat').read().split()
    (pid, comm, state, ppid, pgrp, session, tty, tpgid, flags, minflt, cminflt,
     majflt, cmajflt, utime, stime, cutime, cstime, counter, priority, timeout,
     itrealvalue, starttime, vsize, rss, rlim, startcode, endcode, startstack,
     kstkesp, kstkeip, signal, blocked, sigignore, sigcatch, wchan,
    ) = parts[:35]
    return int(vsize)

def memory_watcher():
    while True:
        time.sleep(120)
        if get_vsize() > 120*1024*1024:
            os.kill(0, signal.SIGTERM)
1 голос
/ 12 ноября 2010

Monit - это служба, которую вы можете запустить для мониторинга внешних процессов.Все, что вам нужно сделать, это сбросить pid в файл, чтобы его можно было прочитать.Люди часто используют его для мониторинга своего веб-сервера.Один из тестов, которые может выполнить monit, - это общее использование памяти.Вы можете установить значение, и если ваш процесс использует слишком много памяти, он будет перезапущен.Вот пример конфигурации monit

check process yourProgram
       with pidfile "/var/run/YOUR.pid"
       start program = "/path/to/PROG.py" 
       stop program = "/script/to/kill/prog/kill_script.sh"
       restart if totalmem is greater than 60.0 MB 
0 голосов
/ 11 ноября 2010

Вы можете прочитать текущее использование памяти, используя файловую систему /proc.

Формат /proc/[pid]/status.В виртуальном файле status вы можете видеть текущую VmRSS (резидентную память).

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