Второе дыхание 32х бит.
Привет всем.
На днях, изучая результаты нагрузочного тестирования очередного выпуска IBProvider-a (v3.19), обнаружил что многопоточная проверка 32-х битной сборки закончилась с огромным количеством ошибок выделения памяти. По всей видимости, после последних изменений в тестовой базе данных и тестовой системе, стандартных 2GB адресного пространства, которые отводятся пользователю в 32-х битном процессе, стало явно маловато.
После недолгого размышления над этой проблемой, я сначала вспомнил волшебную аббревиатуру — «PAE». Потом, через гугловский поиск информации по этому поводу, вышел на статью «4-Gigabyte Tuning». Наиболее ценной информацией в которой оказалось:
To enable an application to use the larger address space, set the IMAGE_FILE_LARGE_ADDRESS_AWARE flag in the image header. The linker included with Microsoft Visual C++ supports the /LARGEADDRESSAWARE switch to set this flag. Setting this flag and then running the application on a system that does not have 4GT support should not affect the application.
On 64-bit editions of Windows, 32-bit applications marked with the IMAGE_FILE_LARGE_ADDRESS_AWARE flag have 4 GB of address space available.
Сначала попробовал «на кошках». После указания /LARGEADDRESSAWARE при линковке 32-битного exe-файла (Visual Studio 2012), я (на 64-битных Windows Vista, Windows 7) без проблем смог выделить память общим объемом 3+ GB.
Потом перезапустил тестирование и, похоже, обрел счастье:
[summary] ------------------------------------------- [SUMMARY INFORMATION] [summary] [TESTS] [summary] EXECUTED : 223790 [summary] SUCCEEDED : 223757 [summary] FAILED : 2 [ 2 error(s) ] [summary] WITH WARNINGS : 31 [ 149 warnings(s) ] [summary] [summary] - - - - - - - - - - - - - - - - - - - - - - [summary] [TEST TIMES] [summary] REAL : 3373389480000 [3 day(s)21:42:18.9480000] [summary] USER : 1196752623442 [1 day(s)09:14:35.2623442] [summary] KERNEL : 178111177731 [04:56:51.1177731] [summary] TOTAL : 1374863801173 [1 day(s)14:11:26.3801173] [TEST HEAP] Test heap is empty [TEST HEAP] Validate ... OK [TEST HEAP] Destroy ... OK [summary] ------------------------------------------- [PROCESS INFORMATION] [summary] [VIRTUAL MEMORY] [summary] [summary] PRIVATE BYTES : 25704 KB [25MB 104KB] [summary] PEAK PRIVATE BYTES : 1572496 KB [1GB 511MB 656KB] [summary] VIRTUAL SIZE : 125120 KB [122MB 192KB] [summary] PAGE FAULT COUNT : 244727315 [summary] [summary] - - - - - - - - - - - - - - - - - - - - - - [summary] [HANDLES] [summary] [summary] HANDLES : 176 [summary] [summary] - - - - - - - - - - - - - - - - - - - - - - [summary] TOTAL ERRORS : 2 [summary] TOTAL WARNINGS: 149 [summary] FULL PASSES : 1 [summary] TOTAL TESTS : 7733017
Ошибки и варнинги — это мой привет Firebird-у: CORE-3984 и CORE-3982, соответственно.
То есть, я модифицировал только EXE тестовой системы. IBProvider и прочие DLL я не трогал.
Любопытства ради, посмотрел настройки компиляции линковки 32-х битного firebird.exe (v3). Обнаружил резервирование 2-мегабайт под стеки. /LARGEADDRESSAWARE не указан. А зря 🙂
Kovalenko on 16 января, 2014
Впрочем, когда дело доходит до крайне тяжелого случая, LARGEADDRESSAWARE уже не в состоянии помочь 🙁
Так что, в случае серьезных мероприятий, нужно использовать только 64-ные битные процессы.