Это краткое описание моей проблемы:
Контекст:
Аппаратное обеспечение: Toradex Colibri VF61
Распространение: Angstrom v2014.12
Релиз ядра: 4.0.2-v2
Язык программного обеспечения: Qt / C ++
Проблема:
Я разрабатываю приложение, которое должно работать не менее 2 недель на встроенном продукте. Моя проблема в том, что мой процесс выполняется в течение 5 дней с небольшой утечкой памяти, что я наблюдаю за «Top», а затем его убивают.
Мой процесс превратился в зомби, как сказал мне Топ.
Попытка № 1:
Я попытался исправить утечку памяти с помощью Valgrind, но некоторые «вероятно» утечки находятся в библиотеках, которые я использую в своей программе (многие из них являются malloc). Это очень большая работа, чтобы понять все библиотеки, и это не цель.
Я думаю, что утечка памяти составляет около 1% потерянной памяти в день, поэтому 15% теряются за 2 недели. Такая утечка является приемлемой для меня, потому что процесс не запустится через 2 недели, и встроенная система предназначена для этого процесса, у меня на машине не запущен какой-либо другой большой процесс. Мониторинг оперативной памяти показывает, что процесс занимает 30% ресурсов, поэтому, по оценкам, 45% через две недели.
Попытка № 2:
Я спросил об управлении памятью в Linux и узнал об OOM-Killer. Я пришел к выводу, что OOM-Killer, вероятно, чувствовал, что мой процесс слишком долго работал с утечкой памяти, и убил его.
Поэтому я установил переменную «oom_score_adj» моего процесса на -1000, чтобы OOM-Killer не мог убить мой процесс, и я попытался снова долго работать с утечкой памяти.
Но на этот раз мой процесс превратился в «спящий» и не убитый, а непригодный для использования. Состояние сна было связано с сообщением об ошибке «Ошибка в« ./app »: malloc (): повреждение памяти (быстрое): 0x72518ddf»). Я точно указал, что в моем коде ноль malloc, только в библиотеках, которые я использую.
Вопросы:
Как вы думаете, возможно ли, что такой процесс, как OOM-Killer, может превратить мой процесс в зомби, потому что у меня утечка памяти и моя программа работает долго?
Как вы думаете, возможно ли, что Linux переведет мой процесс в спящий режим, потому что утечка заполнила память, выделенную для процесса?