Стрессовое тестирование

Привет всем.

Время от времени нагрузочное тестирование 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. Но они приходят только вместе с белочкой проявлялись только при целенаправленном стрессовом тестировании.

Вообщем, вот так вот утром посмотришь на все это и вспоминаешь фразу «лучше бы я вчера умер» с добрым утром 🙂

One Comment

Вести с полей тестирования  on 26 августа, 2016

[…] Все ясно — в этот раз не повезло. […]

Leave a Comment