Wednesday, May 11, 2005

Пошук витоків пам"яті у веб-програмах

Досить недавно проводили пошук витоків пам"яті ( memory leaks ) у нашій веб-програмі. Проблема була описана досить туманно: казали, що сервер використав багато пам"яті, при цьому не згадували, ні, що за програма була такої ненажерливою, ні умов при яких таке відбувалося. Сказали тільки, що після 3-ьох днів роботи програми, сервер потрібно було перезавантажувати.

Це була передісторія. Тепер розкажу, як це все тестувалося... Є така прорама, як Microsoft Application Test Center, вона дозволяє проводити стрес тести для веб-програм. Принцип дії дуже простий - програміст створює проект, потім записує всі свої дії у броузері. Далі генерується код на VB, що відповідає діям користувача. Ось і все - тест готовий, можна починати тестування.

Так як наша програма була спочатку написана індусами, тому перш за все ми подивилися на код. Якість останнього залишала бажати кращого: код досить путаний, до того багато місць у яких пам"ять може "тікти". Наприклад на сервері створюється об"єкт ADODB.Connection, котрий потім не знищується. Таких місць у коді було досить багато. Іншим інструментом, яким ми користувалися був AdoMonitor 1.0 ( http://www.troxo.com/products/adomonitor/ ) - дозволяє трасувати все, що відбувається з ADO.

Цікавий факт, якщо залишити asp код таким, яким він був, тобто з витоками пам"яті,то - після 4-ох хвилин роботи веб-сервер "підвисав" і починав працювати тільки після того, як його перевантажать. Інший цікавий факт, був пов"язаний з ADO, виходить, що на стабільність нижче наведений код ніяк не впливає, так само, як і на витоки пам"яті:

Set cn = server.CreateObject("ADODB.Connection")
cn.ConnectionString = someConnectionString
cn.Open
'cn.Close можна навіть не викликати, об"єкт буде знищено все одно, а з"єднання 'повернеться у пул
cn = Nothing

1 comment: