Забавный баг
Третий день ловлю баг, связанный с тем, что TCP сервер под большой нагрузкой падает с ошибкой out of memory, хотя ему выделено всего 800 мег и еще гиг физической памяти свободно. На каждое воспроизведение бага - сутки работы сервера под нагрузкой в несколько раз больше рабочей.
Оказалось - нехватка виртуальной памяти, причем вообще - не самой памяти, а ее адресного пространства. Менеджер памяти при выделении/удалении сильно фрагментирует память, в итоге адресам становится мало 2^31 и все падает, с ошибками типа "not enough storage" в самых левых функциях вроде записи в инишник.
Причем, западло в том, что увидеть это число в Task Manager нельзя, нужно смотреть Process Explorer или делать лог perfmon-ом.
Оказалось - нехватка виртуальной памяти, причем вообще - не самой памяти, а ее адресного пространства. Менеджер памяти при выделении/удалении сильно фрагментирует память, в итоге адресам становится мало 2^31 и все падает, с ошибками типа "not enough storage" в самых левых функциях вроде записи в инишник.
Причем, западло в том, что увидеть это число в Task Manager нельзя, нужно смотреть Process Explorer или делать лог perfmon-ом.
no subject
Вот в том числе из-за таких вещей и возникает желание переходить на .net.
(no subject)
(no subject)
(no subject)
(no subject)
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
(no subject)
(no subject)
(no subject)
no subject
интересно, можно ли его, или подобный, раньше чем за сутки обнаруживать - вроде можно, нет?
(no subject)
no subject
Всё хорошо работало до тех пор, пока люди не написали алгоритм, который в своей работе использует числа порядка двойки в степени 5033164800 (600*1024*1024*8). На такие числа этот наколенный класс пытается выделить непрерывный кусок памяти объёмом в 600 мегабайт, что ему, естественным образом, удаётся не всегда. Язык - C++. К счастью, проблема стала очевидной, когда в отладчике увидели падение на строке new unsigned int[digitsCount] и посмотрели, чему равен digitsCount.
no subject
(no subject)