metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-03-23 09:57 am

Забавный баг

Третий день ловлю баг, связанный с тем, что TCP сервер под большой нагрузкой падает с ошибкой out of memory, хотя ему выделено всего 800 мег и еще гиг физической памяти свободно. На каждое воспроизведение бага - сутки работы сервера под нагрузкой в несколько раз больше рабочей.

Оказалось - нехватка виртуальной памяти, причем вообще - не самой памяти, а ее адресного пространства. Менеджер памяти при выделении/удалении сильно фрагментирует память, в итоге адресам становится мало 2^31 и все падает, с ошибками типа "not enough storage" в самых левых функциях вроде записи в инишник.
Причем, западло в том, что увидеть это число в Task Manager нельзя, нужно смотреть Process Explorer или делать лог perfmon-ом.

[identity profile] aamonster.livejournal.com 2009-03-23 08:06 am (UTC)(link)
Ничего забавного...
Вот в том числе из-за таких вещей и возникает желание переходить на .net.

[identity profile] thundertoad.livejournal.com 2009-03-23 08:44 am (UTC)(link)
наверное, лучший, но геморройный метод - собственный memory manager

[identity profile] bigfrogg.livejournal.com 2009-03-23 09:00 am (UTC)(link)
По моему наиболее просто задача решается переходом на x86-64. (Если заказчик программы такое допускает)

[identity profile] eu3eu.livejournal.com 2009-03-23 09:45 am (UTC)(link)
А нефиг большие объекты в памяти держать. Временные файлы для того придуманы. Причём, не факт, что они реально на диске создаются - иногда они из кэша не успевают вылиться, как уже прибиваются, так что быстродействие не страдает.

[identity profile] lupus-lupusum.livejournal.com 2009-03-23 12:36 pm (UTC)(link)
смешной баг какой, сутки работы говоришь
интересно, можно ли его, или подобный, раньше чем за сутки обнаруживать - вроде можно, нет?


[identity profile] nekhill.livejournal.com 2009-03-23 01:10 pm (UTC)(link)
Вот буквально пару дней назад видел в чужой наколенной реализации класса больших целых чисел подобную же проблему.
Всё хорошо работало до тех пор, пока люди не написали алгоритм, который в своей работе использует числа порядка двойки в степени 5033164800 (600*1024*1024*8). На такие числа этот наколенный класс пытается выделить непрерывный кусок памяти объёмом в 600 мегабайт, что ему, естественным образом, удаётся не всегда. Язык - C++. К счастью, проблема стала очевидной, когда в отладчике увидели падение на строке new unsigned int[digitsCount] и посмотрели, чему равен digitsCount.

[identity profile] thesz.livejournal.com 2009-03-23 09:23 pm (UTC)(link)
Да уж, куда как забавен. ;)