Второе дыхание 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 не указан. А зря 🙂

One Comment

Kovalenko  on 16 января, 2014

Впрочем, когда дело доходит до крайне тяжелого случая, LARGEADDRESSAWARE уже не в состоянии помочь 🙁

//[16.01.2014 06:00:06]
[summary] -------------------- [PROCESS INFORMATION]
[summary] [VIRTUAL MEMORY]
[summary] 
[summary] PRIVATE BYTES      : 23332 KB       [22MB 804KB]
[summary] PEAK PRIVATE BYTES : 3592252 KB     [3GB 436MB 60KB]
[summary] VIRTUAL SIZE       : 126404 KB      [123MB 452KB]
[summary] PAGE FAULT COUNT   : 247850338
[summary] 
[summary] - - - - - - - - - - - - - - - - - - - - - -
[summary] [HANDLES]
[summary] 
[summary] HANDLES            : 177
[summary] 
[summary] - - - - - - - - - - - - - - - - - - - - - -
[summary] TOTAL ERRORS  : 7593
[summary] TOTAL WARNINGS: 171
[summary] FULL PASSES   : 1
[summary] TOTAL TESTS   : 7733018

Так что, в случае серьезных мероприятий, нужно использовать только 64-ные битные процессы.

Leave a Comment