malloc зависает в Linux - PullRequest
       24

malloc зависает в Linux

1 голос
/ 17 июня 2010

Я использую SUSE 10 Linux на машине с 16 Гб оперативной памяти и 2 четырехъядерными процессорами. Есть 8 процессов, которые выполняют некоторую работу (интенсивная загрузка ЦП / сетевой ввод / вывод). Из которых 4 имеют утечку памяти (это тестовые условия, поэтому проблем с утечками здесь нет). Общее пространство, занимаемое всеми процессами, составляет около 15,4 ГБ, в системе свободно только 200 МБ. Все хорошо на несколько часов. Но после этого malloc зависает (для процесса, у которого нет утечки памяти). Оно зависло более чем на 4 минуты (обратите внимание, что процессор не на 100%, но io значительно вырос). Теперь нет проблем в зависшем процессе (он не повредил память). Что делает malloc? (пытается ли дефрагментировать или создавать пространство подкачки).

Есть указатели?

Ответы [ 3 ]

4 голосов
/ 17 июня 2010

Если malloc() просто занимает много времени, вы, вероятно, просматриваете фрагментированный бесплатный список, многие записи которого были заменены.Это согласуется с низким ЦП, высоким IO и ограниченным свободным ОЗУ.

Для получения дополнительной информации о malloc() реализациях (включая понимание фрагментированных свободных списков) статья Википедии хороша: http://en.wikipedia.org/wiki/Malloc#Implementations

Да, утечки памяти неприемлемы даже в тестовой среде.Как видите, они мешают программам, которые (насколько вы знаете) не имеют утечек и стоят вам времени.

1 голос
/ 17 июня 2010

До вас машина была просто недолговечна по оперативной памяти. Теперь ваш malloc выходит за пределы 16G вашей машины, и ваша система начинает обмениваться. Но проверка вашего приложения в соответствии с рекомендациями PierreBdR, безусловно, хорошая идея.

1 голос
/ 17 июня 2010

Это может раздражать, но я бы рекомендовал использовать Valgrind для процесса, который блокирует. Там могут быть ошибки, которые вы не обнаружили раньше. По крайней мере, вы можете иметь представление о том, что происходит. Однако несколько часов могут стать днями: /

...