Стрессовое тестирование
Привет всем.
Время от времени нагрузочное тестирование 32-битной сборки IBProvider-a (как правило, отладочной) начинает плющить и оно превращается в стрессовое — не хватает оперативной памяти. Выглядит это вот так:
[10.08.2016 08:14:12] [info] Provider DLL :_IBProvider_v3_vc14xp_d.dll [10.08.2016 08:14:12] [info] Provider Version:3.31.0.21375 [10.08.2016 08:14:12] [info] Server Name :Firebird [10.08.2016 08:14:12] [info] Server Version :2.5.6.26993 [10.08.2016 08:14:12] [info] Client Name :Firebird [10.08.2016 08:14:12] [info] Client Version :2.5.6.26993 [10.08.2016 08:14:12] [info] Database ODS :11.2 [10.08.2016 08:14:12] [info] Database Dialect:1 [10.08.2016 08:14:12] [info] ConnectionString: provider=LCPI.IBProvider.3;location=localhost:d:\database\ibp_test_fb25_d1_2.gdb;user id=gamer;password=vermut;ctype=win1251;icu_library=icuuc30.dll;temp_file_dir=d:\database\temp;dbclient_type=fb;dbclient_library=fbclient.dll [10.08.2016 08:14:12] [ExecuteTests] [10.08.2016 08:14:12] [ExecuteTests] Enter [cancel] for interrupt execution [10.08.2016 08:14:12] [ExecuteTests] [10.08.2016 08:14:12] Creation 4 thread(s)... ..... [12.08.2016 06:29:30] [summary] ------------------------------------------- [SUMMARY INFORMATION] [12.08.2016 06:29:30] [summary] [TESTS] [12.08.2016 06:29:30] [summary] EXECUTED : 218228 [12.08.2016 06:29:30] [summary] SUCCEEDED : 215491 [12.08.2016 06:29:30] [summary] FAILED : 2694 [ 2705 error(s) ] [12.08.2016 06:29:30] [summary] WITH WARNINGS : 44 [ 336 warning(s) ] [12.08.2016 06:29:30] [summary] [12.08.2016 06:29:30] [summary] - - - - - - - - - - - - - - - - - - - - - - [12.08.2016 06:29:30] [summary] [TEST TIMES] [12.08.2016 06:29:30] [summary] REAL : 6612821080000 [7 day(s)15:41:22.1080000] [12.08.2016 06:29:30] [summary] USER : 3294589955031 [3 day(s)19:30:58.9955031] [12.08.2016 06:29:30] [summary] KERNEL : 240435917246 [06:40:43.5917246] [12.08.2016 06:29:30] [summary] TOTAL : 3535025872277 [4 day(s)02:11:42.5872277] [12.08.2016 06:29:30] [12.08.2016 06:29:30] [TEST HEAP] Test heap is empty [12.08.2016 06:29:30] [TEST HEAP] Validate ... OK [12.08.2016 06:29:30] [TEST HEAP] Destroy ... OK [12.08.2016 06:29:30] [12.08.2016 06:29:30] [summary] ------------------------------------------- [PROCESS INFORMATION] [12.08.2016 06:29:30] [summary] [VIRTUAL MEMORY] [12.08.2016 06:29:30] [summary] [12.08.2016 06:29:30] [summary] PRIVATE BYTES : 22120 KB [21MB 616KB] [12.08.2016 06:29:30] [summary] PEAK PRIVATE BYTES : 3546824 KB [3GB 391MB 712KB] [12.08.2016 06:29:30] [summary] VIRTUAL SIZE : 126356 KB [123MB 404KB] [12.08.2016 06:29:30] [summary] PAGE FAULT COUNT : 585666157 [12.08.2016 06:29:30] [summary] [12.08.2016 06:29:30] [summary] - - - - - - - - - - - - - - - - - - - - - - [12.08.2016 06:29:30] [summary] [HANDLES] [12.08.2016 06:29:30] [summary] [12.08.2016 06:29:30] [summary] HANDLES : 181 [12.08.2016 06:29:30] [summary] [12.08.2016 06:29:30] [summary] - - - - - - - - - - - - - - - - - - - - - - [12.08.2016 06:29:30] [summary] TOTAL ERRORS : 2705 [12.08.2016 06:29:30] [summary] TOTAL WARNINGS: 336 [12.08.2016 06:29:30] [summary] FULL PASSES : 1 [12.08.2016 06:29:30] [summary] TOTAL TESTS : 7754446
Как 32-битному процессу удается съесть больше 2GB памяти объясняется здесь.
Памяти может не хватить где угодно: внутри fbclient.dll, в провайдере, в тестовой системе, в сервисных компонентах OLE DB.
И если код не устойчив к исключениям, то самое мягкое что может произойти — это утечка памяти. А так, если вспомнить исправленные баги провайдера — его ICommand::Execute мог вернуть S_OK вместо E_OUTOFMEMORY. Оригинальный fbclient.dll может заклинить (не освобождается многопоточная блокировка) или рухнуть из-за повторного освобождения динамической памяти (потому что не обнуляют указатели после оператора delete).
Но в данном конкретном случае повезло — тест доработал до конца и завершился по человечески. 21MB занятого пространства и 181 дескриптор — это нормальное финальное состояние.
Повезло, потому что в моем модифицированном fbclient.dll еще остались проблемы, на которые я махнул рукой. Все это актуально и для клиента FB3 (к ним еще добавились новые, ОО-проблемы). Что конкретно выбешивает.
А еще есть очень редкие глюки (утечка памяти), корни которых уходят в сервисные компоненты OLE DB. Но они приходят только вместе с белочкой проявлялись только при целенаправленном стрессовом тестировании.
Вообщем, вот так вот утром посмотришь на все это и вспоминаешь фразу «лучше бы я вчера умер» с добрым утром 🙂
Вести с полей тестирования on 26 августа, 2016
[…] Все ясно — в этот раз не повезло. […]