30 дек. 2010 г.

IIS и OutOfMemory - больной мозоль от Microsoft

Знаете, оказывается я очень счастливый человек. До недавнего времени понятия даже не имел что  в виндовом 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 Гб и получил интересный результат. Ошибка пропала, но увеличилась загрузка процессора. Слава Богу, что ресурсов на сервере хватает. Так что клиент получил еще одну небольшую передышку. Надеюсь, что он использует ее для того чтобы переделать сайт под новую платформу.

2 комментария:

Rustam Sydykov комментирует...

Привет, Серега!

Интересные проблемы тебе приходиться решать - завидую... :)) Но, как ты это правильно заметил, это передышка. А что клиент планирует сделать чтобы решить кардинально проблему?

Руст.

Унунсептий комментирует...

Привет, Руст!

Задачи интересные, просто иногда немного утомляют :)

Клиент пока думает, но я ему сказал что только по новой переделывать под новую платформу и закладывать наперед возможность апгрейда. Задача сложная в большинстве своем из-за того, что нужно перенести все так, чтобы SEO-эффект не пропал, ведь сайт сильно раскрученый.

Латать дыры однозначно больше не буду, по крайней мере постараюсь настоять на переделывании под новую платформу :) Тем более под .NET 3.5 есть огромная куча вкусностей и писать код под 1.1 уже никак неинтересно, когда знаешь, что "где-то там" уже всё есть.

Сергей