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

[identity profile] metaclass.livejournal.com 2009-03-23 09:10 am (UTC)(link)
Для заказчиков с такой нагрузкой можно было бы, но мой компилятор 64 бита не поддерживает.

[identity profile] bigfrogg.livejournal.com 2009-03-23 09:12 am (UTC)(link)
Значит самый просто способ - переписать программу так что бы она статически выделаля память сразу и много..

[identity profile] metaclass.livejournal.com 2009-03-23 09:23 am (UTC)(link)
Да, это практически и есть кастомный аллокатор для некоторых классов.

[identity profile] potan.livejournal.com 2009-03-23 09:45 am (UTC)(link)
Частично.
Фрагментация памяти создает много частично заполненых страниц и свопинг начнется раньше. А если учесть и то, что размер указателя вырос, то программа может потребовать значительно больше памяти.

[identity profile] bigfrogg.livejournal.com 2009-03-23 09:52 am (UTC)(link)
Ну у метакалса не хватает не пямти, памяти как раз он сказал есть ещё гиг. А с современными ценами на память, день работы программиста стоит как 8 гиг озу.
Значительно памяти больше программа не потребует. Даже если предпложить что вся программа состоит только из указателей, то памяти будет тратить всего в 2 раза больше, что совсем не много.

[identity profile] potan.livejournal.com 2009-03-23 10:23 am (UTC)(link)
Ну да, по этому частично решает.
А цену рабочего дня программиста надо сравнивать с ценой памяти, помноженной на количество пользователей...

[identity profile] metaclass.livejournal.com 2009-03-23 10:45 am (UTC)(link)
Оптимизировать нельзя - если сервер не будет требовать пару гиг памяти, это неэнтерпрайзно, клиенты не поймут, за что они платили :)

[identity profile] potan.livejournal.com 2009-03-23 10:56 am (UTC)(link)
Еще один повод отказаться от язвков класса C :-).