Знаете, оказывается я очень счастливый человек. До недавнего времени понятия даже не имел что в виндовом IIS существует ошибка OutOfMemory. По крайней мере не знал до этого понедельника :)
Ну, обо всем по порядку. У меня есть клиент, жуткий консерватор, причем во всех сферах жизни. Сейчас его консерватизм сыграл с ним очень злую шутку. У клиента есть хороший бизнес и сайт под бизнес. Без сайта бизнес как бы не существует, потому что клиенты, товары и вообще все завязано на сайте. Делали его давно, но работает он стабильно. Скорее сказать работал. Проблема в том что сайт был написан под фреймворк .NET 1.1. Кто не в курсе .NET 1.1 был выпущен в апреле 2003 года, а восемь лет для програмного обеспечения - это ОЧЕНЬ много. Но клиента все устраивало, так как было написано добротно и все работало.
Проблемы начались совсем недавно. У него была какая-то специфическая лицензия под Windows 2003 Server и она заканчивается в 2010. Вместо нее ему всунули Windows 2008 64-бит и вот тут-то все и началось. Сайт и новая винда оказались очень чужие друг другу. Вдобавок оказалось что апгрейд сайта до нового фреймворка сделать практически нереально (около 80 библиотек и не ко всем есть исходники). Короче, патовая ситуация.
В идеале нужно было проводить разработку сайта с нуля под новый фремворк. Понятно что это недешево, поэтому клиент зажал денег на разработку и попросил только подогнать чтобы работало без ошибок под Windows 2008. Вроде как со скрипом сайт заработал, но совсем недавно стал вылетать с ошибкой OutOfMemory, хотя на сервере более чем достаточно памяти (8 Гб всего и почти всегда больше 4 Гб свободно).
Проблема оказалась в том, что у 32-битных приложений совсем другой принцип работы с памятью. Microsoft признает эту ошибку, но в качестве решения предлагает проапргрейдить приложение до .NET 2 или выше, что как Вы понимаете в этой ситуации невозможно. Неделя головной боли с попытками пофиксить проблему ни к чему не привела. Ошибка продолжала вылетать, причем без всякой закономерности. Иногда после 5-6 часов работы, иногда сразу же после последнего перезапуска IIS.
Решение было найдено совершенно случайно вчера вечером. Раз проблемы с памятью нельзя решить, то в голову пришла идея ограничить память для Application Pool в котором крутится сайт. Попробовал ограничить памятьдо 1 Гб и получил интересный результат. Ошибка пропала, но увеличилась загрузка процессора. Слава Богу, что ресурсов на сервере хватает. Так что клиент получил еще одну небольшую передышку. Надеюсь, что он использует ее для того чтобы переделать сайт под новую платформу.