Это потому, что в вашем запросе была ошибка. MySQli->query()
вернет false при ошибке. Измените его на что-то вроде ::
$result = $this->database->query($query);
if (!$result) {
throw new Exception("Database Error [{$this->database->errno}] {$this->database->error}");
}
Это должно вызвать исключение, если есть ошибка ...
С ps
или подобные инструменты Вы только выделите страницы объема памяти тем процессом. Это число корректно, но:
не отражает фактический объем памяти, используемый приложением, только объем памяти, зарезервированный для него
, может вводить в заблуждение, если страницами поделятся, например, несколько потоков или при помощи динамически подключаемых библиотек
, Если Вы действительно хотите знать, какой объем памяти Ваше приложение на самом деле использует, необходимо выполнить его в профилировщике. Например, valgrind
может дать Вам понимание об объеме памяти, используемом, и, что еще более важно, о возможных утечках памяти в Вашей программе. Инструмент профилировщика "кучи" valgrind называют 'горным массивом':
Горный массив является профилировщиком "кучи". Это выполняет подробное профилирование "кучи" путем взятия обычных снимков "кучи" программы. Это производит график, показывающий использование "кучи" со временем, включая информацию, о которой части программы ответственны за большинство выделений памяти. График добавляется текстом или файлом HTML, который включает больше информации для определения, где большая часть памяти выделяется. Горный массив запускает программы о 20x медленнее, чем нормальный.
, Как объяснено в valgrind документация , необходимо запустить программу через valgrind:
valgrind --tool=massif <executable> <arguments>
Горный массив пишет дамп снимков использования памяти (например, massif.out.12345
). Они обеспечивают, (1) временная шкала использования памяти, (2) для каждого снимка, записи того, где в Вашей памяти программ был выделен. Большой графический инструмент для анализа этих файлов горный-массив-visualizer . Но я нашел ms_print
, основанный на простом тексте инструмент поставленный с valgrind, уже чтобы очень помочь.
Для нахождения утечек памяти используйте (значение по умолчанию) memcheck
инструмент valgrind.
Другое голосование за valgrind здесь, но я хотел бы добавить, что можно использовать инструмент как Alleyoop, чтобы помочь Вам интерпретировать результаты, сгенерированные valgrind.
я использую эти два инструмента все время и всегда имею наклон, нетекучий код для гордого показа для него;)
Доберитесь valgrind. дают ему Вашу программу для выполнения, и это скажет Вам много о своем использовании памяти.
Это применялось бы только для случая программы, которая работает в течение некоторого времени и остановки. Я не знаю, может ли valgrind достать уже рабочий процесс или процессы должен-остановки, такие как демоны.
Нет единственного ответа для этого, потому что Вы не можете прикрепить точку точно объем памяти, который использует процесс. Большинство процессов в соответствии с 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 даст Вам лучший профиль использования памяти в течение времени жизни программы
Нет никакого простого способа вычислить это. Но некоторые люди попытались получить некоторые хорошие ответы:
Трудно для сообщения наверняка но вот две "близких" вещи, которые могут помочь.
$ 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
Valgrind великолепен, если у вас есть время запустить его. valgrind --tool = massif
- правильное решение.
Однако я начинаю запускать более крупные примеры, и использование valgrind больше нецелесообразно. Есть ли способ определить максимальное использование памяти (размер страницы по модулю и общие страницы) программой?
В реальной системе unix работает / usr / bin / time -v
. Однако в Linux это не работает.
Если вам нужно что-то более быстрое, чем профилирование с помощью Valgrind, а ваше ядро устарело и вы не можете использовать smaps, используйте ps с параметрами для отображения резидентного набора процесса (с ps -o rss, команда
) может дать вам быстрое и разумное _проксимацию_
реального объема используемой памяти без подкачки.
В последних версиях Linux используйте подсистему smaps . Например, для процесса с PID 1234:
cat /proc/1234/smaps
он точно скажет вам, сколько памяти он использует в данный момент. Что еще более важно, он разделит память на частную и общую, чтобы вы могли определить, сколько памяти использует ваш экземпляр программы, не включая память, совместно используемую несколькими экземплярами программы.
Это отличный обзор инструментов и проблем: ссылка на archive.org
Я процитирую его, чтобы больше разработчиков его действительно прочитали.
Если если вы хотите проанализировать использование памяти всей системой или тщательно проанализировать использование памяти одним приложением (а не только его использование кучи), используйте exmap . Для анализа всей системы найдите процессы с наиболее эффективным использованием, они на практике занимают больше всего памяти, найдите процессы с наибольшим объемом записи, они создают наибольшее количество данных (и, следовательно, возможно, утечка или очень неэффективны в использовании данных). Выберите такое приложение и проанализируйте его сопоставления во втором просмотре списка. Смотрите раздел exmap для более подробной информации. Также используйте xrestop для проверки высокого использования ресурсов X, особенно если процесс X-сервера занимает много памяти. См. Подробности в разделе xrestop.
Если вы хотите обнаружить утечки, используйте valgrind или, возможно, kmtrace .
Если вы хотите проанализировать использование кучи (malloc и т. Д.) приложение, либо запустите его в memprof , либо с kmtrace , профилируйте приложение и найдите в дереве вызовов функций самые большие выделения. См. Их разделы для получения более подробной информации.
][] Valgrind[] может показать подробную информацию, но это [] значительно замедляет [] целевое приложение, и большую часть времени оно изменяет поведение приложения.[
]
[]Exmap[] был чем-то, чего я еще не знал, но кажется, что для получения информации нужен []модуль ядра [], что может быть препятствием. [
] Я полагаю, что все хотят знать "использование памяти" WRT...[
]...
В linux объем физической памяти, который может быть использован одним процессом, можно грубо разделить на следующие категории[
] []M.a анонимная картографическая память [] [
] [] [] M.n. названная картографическая память [] [
] [] Утилита, включенная в 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
] Попробуйте команду pmap:
sudo pmap -x <process pid>