Как измерить фактическое использование памяти приложения или процесса?

Это потому, что в вашем запросе была ошибка. MySQli->query() вернет false при ошибке. Измените его на что-то вроде ::

$result = $this->database->query($query);
if (!$result) {
    throw new Exception("Database Error [{$this->database->errno}] {$this->database->error}");
}

Это должно вызвать исключение, если есть ошибка ...

673
задан Community 23 May 2017 в 10:31
поделиться

12 ответов

С ps или подобные инструменты Вы только выделите страницы объема памяти тем процессом. Это число корректно, но:

  • не отражает фактический объем памяти, используемый приложением, только объем памяти, зарезервированный для него

  • , может вводить в заблуждение, если страницами поделятся, например, несколько потоков или при помощи динамически подключаемых библиотек

, Если Вы действительно хотите знать, какой объем памяти Ваше приложение на самом деле использует, необходимо выполнить его в профилировщике. Например, valgrind может дать Вам понимание об объеме памяти, используемом, и, что еще более важно, о возможных утечках памяти в Вашей программе. Инструмент профилировщика "кучи" valgrind называют 'горным массивом':

Горный массив является профилировщиком "кучи". Это выполняет подробное профилирование "кучи" путем взятия обычных снимков "кучи" программы. Это производит график, показывающий использование "кучи" со временем, включая информацию, о которой части программы ответственны за большинство выделений памяти. График добавляется текстом или файлом HTML, который включает больше информации для определения, где большая часть памяти выделяется. Горный массив запускает программы о 20x медленнее, чем нормальный.

, Как объяснено в valgrind документация , необходимо запустить программу через valgrind:

valgrind --tool=massif <executable> <arguments>

Горный массив пишет дамп снимков использования памяти (например, massif.out.12345). Они обеспечивают, (1) временная шкала использования памяти, (2) для каждого снимка, записи того, где в Вашей памяти программ был выделен. Большой графический инструмент для анализа этих файлов горный-массив-visualizer . Но я нашел ms_print, основанный на простом тексте инструмент поставленный с valgrind, уже чтобы очень помочь.

Для нахождения утечек памяти используйте (значение по умолчанию) memcheck инструмент valgrind.

340
ответ дан ypnos 23 May 2017 в 10:31
поделиться

Другое голосование за здесь, но я хотел бы добавить, что можно использовать инструмент как Alleyoop, чтобы помочь Вам интерпретировать результаты, сгенерированные valgrind.

я использую эти два инструмента все время и всегда имею наклон, нетекучий код для гордого показа для него;)

1
ответ дан ShiDoiSi 23 May 2017 в 10:31
поделиться

Доберитесь valgrind. дают ему Вашу программу для выполнения, и это скажет Вам много о своем использовании памяти.

Это применялось бы только для случая программы, которая работает в течение некоторого времени и остановки. Я не знаю, может ли valgrind достать уже рабочий процесс или процессы должен-остановки, такие как демоны.

4
ответ дан DarenW 23 May 2017 в 10:31
поделиться

Нет единственного ответа для этого, потому что Вы не можете прикрепить точку точно объем памяти, который использует процесс. Большинство процессов в соответствии с Linux пользуется совместно использованными библиотеками. Например, скажем, Вы хотите вычислить использование памяти для процесса 'ls'. Проведите Вас подсчет только память, используемая исполняемым файлом 'ls' (если Вы могли бы изолировать его)? Как насчет libc? Или все, что они другой освобождают, которые требуются выполнить 'ls'?

linux-gate.so.1 =>  (0x00ccb000)
librt.so.1 => /lib/librt.so.1 (0x06bc7000)
libacl.so.1 => /lib/libacl.so.1 (0x00230000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00162000)
libc.so.6 => /lib/libc.so.6 (0x00b40000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00cb4000)
/lib/ld-linux.so.2 (0x00b1d000)
libattr.so.1 => /lib/libattr.so.1 (0x00229000)
libdl.so.2 => /lib/libdl.so.2 (0x00cae000)
libsepol.so.1 => /lib/libsepol.so.1 (0x0011a000)

Вы могли утверждать, что они совместно используются другими процессами, но 'ls' не может быть выполнен в системе без них загружаемый.

кроме того, если необходимо знать, в каком количестве нуждается память процесс, чтобы сделать планирование мощностей, необходимо вычислить, сколько использует каждая дополнительная копия процесса. Я думаю, что/proc/PID/status мог бы дать Вам достаточно информации использования памяти В единственное время. С другой стороны, valgrind даст Вам лучший профиль использования памяти в течение времени жизни программы

20
ответ дан Dprado 23 May 2017 в 10:31
поделиться

Нет никакого простого способа вычислить это. Но некоторые люди попытались получить некоторые хорошие ответы:

124
ответ дан Amal Murali 23 May 2017 в 10:31
поделиться

Трудно для сообщения наверняка но вот две "близких" вещи, которые могут помочь.

$ ps aux 

даст Вам Виртуальный Размер (VSZ)

, можно также получить подробную статистику от/proc файловой системы путем движения в /proc/$pid/status

, самым важным является VmSize, который должен быть близко к тому, что ps aux дает.

/proc/19420$ cat status
Name:   firefox
State:  S (sleeping)
Tgid:   19420
Pid:    19420
PPid:   1
TracerPid:  0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize: 256
Groups: 4 6 20 24 25 29 30 44 46 107 109 115 124 1000 
VmPeak:   222956 kB
VmSize:   212520 kB
VmLck:         0 kB
VmHWM:    127912 kB
VmRSS:    118768 kB
VmData:   170180 kB
VmStk:       228 kB
VmExe:        28 kB
VmLib:     35424 kB
VmPTE:       184 kB
Threads:    8
SigQ:   0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000020001000
SigCgt: 000000018000442f
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_allowed:   03
Mems_allowed:   1
voluntary_ctxt_switches:    63422
nonvoluntary_ctxt_switches: 7171

187
ответ дан Skynet 23 May 2017 в 10:31
поделиться

Valgrind великолепен, если у вас есть время запустить его. valgrind --tool = massif - правильное решение.

Однако я начинаю запускать более крупные примеры, и использование valgrind больше нецелесообразно. Есть ли способ определить максимальное использование памяти (размер страницы по модулю и общие страницы) программой?

В реальной системе unix работает / usr / bin / time -v . Однако в Linux это не работает.

9
ответ дан 22 November 2019 в 21:40
поделиться

Если вам нужно что-то более быстрое, чем профилирование с помощью Valgrind, а ваше ядро ​​устарело и вы не можете использовать smaps, используйте ps с параметрами для отображения резидентного набора процесса (с ps -o rss, команда ) может дать вам быстрое и разумное _проксимацию_ реального объема используемой памяти без подкачки.

3
ответ дан 22 November 2019 в 21:40
поделиться

В последних версиях Linux используйте подсистему smaps . Например, для процесса с PID 1234:

cat /proc/1234/smaps

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

129
ответ дан 22 November 2019 в 21:40
поделиться

Это отличный обзор инструментов и проблем: ссылка на archive.org

Я процитирую его, чтобы больше разработчиков его действительно прочитали.

Если если вы хотите проанализировать использование памяти всей системой или тщательно проанализировать использование памяти одним приложением (а не только его использование кучи), используйте exmap . Для анализа всей системы найдите процессы с наиболее эффективным использованием, они на практике занимают больше всего памяти, найдите процессы с наибольшим объемом записи, они создают наибольшее количество данных (и, следовательно, возможно, утечка или очень неэффективны в использовании данных). Выберите такое приложение и проанализируйте его сопоставления во втором просмотре списка. Смотрите раздел exmap для более подробной информации. Также используйте xrestop для проверки высокого использования ресурсов X, особенно если процесс X-сервера занимает много памяти. См. Подробности в разделе xrestop.

Если вы хотите обнаружить утечки, используйте valgrind или, возможно, kmtrace .

Если вы хотите проанализировать использование кучи (malloc и т. Д.) приложение, либо запустите его в memprof , либо с kmtrace , профилируйте приложение и найдите в дереве вызовов функций самые большие выделения. См. Их разделы для получения более подробной информации.

39
ответ дан 22 November 2019 в 21:40
поделиться
[

][] Valgrind[] может показать подробную информацию, но это [] значительно замедляет [] целевое приложение, и большую часть времени оно изменяет поведение приложения.[
] []Exmap[] был чем-то, чего я еще не знал, но кажется, что для получения информации нужен []модуль ядра [], что может быть препятствием. [

] [

] Я полагаю, что все хотят знать "использование памяти" WRT...[
]... В linux объем физической памяти, который может быть использован одним процессом, можно грубо разделить на следующие категории[

]. [
    ] [
  • ] [

    ] []M.a анонимная картографическая память [] [

    ] [
      ] [
    • ].p private [
        ] [
      • ].d грязная == malloc/mmapped heap и stack allocation and write memory [
      • ] [
      • ].c clean == malloc/mmapped heap and stack memory once allocation, write, then freed, but not reclaimed yet [
      • ] [
      ][
    • ] [
    • ].s shared [
        ] [
      • ].d грязные == [] malloc/mmapped heap может получить копию на запись и поделиться между процессами [] (отредактировано) [
      • ] [
      • ].c clean == [] malloc/mmapped heap может получить копию на запись и разделить ее между процессами [] (отредактировано) [
      • ] [
      ][
    • ] [
    ][
  • ] [
  • ] [

    ] [] M.n. названная картографическая память [] [

    ] [
      ] [
    • ].p private [
        ] [
      • ].d грязный == файл mmapped write memory private [
      • ] [
      • ].c clean == mapped program/library text private mapped [
      • ] [
      ][
    • ] [
    • ].s shared [
        ] [
      • ].d грязный == файл mmapped write memory shared [
      • ] [
      • ].c clean == mapped library text shared mapped [
      • ] [
      ][
    • ] [
    ][
  • ] [
] [

] Утилита, включенная в Android, называемая [] showmap[], весьма полезна [

]. [
virtual                    shared   shared   private  private
size     RSS      PSS      clean    dirty    clean    dirty    object
-------- -------- -------- -------- -------- -------- -------- ------------------------------
       4        0        0        0        0        0        0 0:00 0                  [vsyscall]
       4        4        0        4        0        0        0                         [vdso]
      88       28       28        0        0        4       24                         [stack]
      12       12       12        0        0        0       12 7909                    /lib/ld-2.11.1.so
      12        4        4        0        0        0        4 89529                   /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
      28        0        0        0        0        0        0 86661                   /usr/lib/gconv/gconv-modules.cache
       4        0        0        0        0        0        0 87660                   /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
       4        0        0        0        0        0        0 89528                   /usr/lib/locale/en_US.utf8/LC_TELEPHONE
       4        0        0        0        0        0        0 89527                   /usr/lib/locale/en_US.utf8/LC_ADDRESS
       4        0        0        0        0        0        0 87717                   /usr/lib/locale/en_US.utf8/LC_NAME
       4        0        0        0        0        0        0 87873                   /usr/lib/locale/en_US.utf8/LC_PAPER
       4        0        0        0        0        0        0 13879                   /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
       4        0        0        0        0        0        0 89526                   /usr/lib/locale/en_US.utf8/LC_MONETARY
       4        0        0        0        0        0        0 89525                   /usr/lib/locale/en_US.utf8/LC_TIME
       4        0        0        0        0        0        0 11378                   /usr/lib/locale/en_US.utf8/LC_NUMERIC
    1156        8        8        0        0        4        4 11372                   /usr/lib/locale/en_US.utf8/LC_COLLATE
     252        0        0        0        0        0        0 11321                   /usr/lib/locale/en_US.utf8/LC_CTYPE
     128       52        1       52        0        0        0 7909                    /lib/ld-2.11.1.so
    2316       32       11       24        0        0        8 7986                    /lib/libncurses.so.5.7
    2064        8        4        4        0        0        4 7947                    /lib/libdl-2.11.1.so
    3596      472       46      440        0        4       28 7933                    /lib/libc-2.11.1.so
    2084        4        0        4        0        0        0 7995                    /lib/libnss_compat-2.11.1.so
    2152        4        0        4        0        0        0 7993                    /lib/libnsl-2.11.1.so
    2092        0        0        0        0        0        0 8009                    /lib/libnss_nis-2.11.1.so
    2100        0        0        0        0        0        0 7999                    /lib/libnss_files-2.11.1.so
    3752     2736     2736        0        0      864     1872                         [heap]
      24       24       24        0        0        0       24 [anon]
     916      616      131      584        0        0       32                         /bin/bash
-------- -------- -------- -------- -------- -------- -------- ------------------------------
   22816     4004     3005     1116        0      876     2012 TOTAL
]
12
ответ дан 22 November 2019 в 21:40
поделиться

Попробуйте команду pmap:

sudo pmap -x <process pid>
270
ответ дан 22 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

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