slay написал(а):
-------------------------------------------------------
> Ситуация такая - рабочий процесс таки
> перезапускается, вот только условие понять не
> могу. Если в кол-ве запросов, то выходит около
> 360-370.
Наблюдая в клиентском администраторе за списком процессов сервера выяснил, что процесс перезапускается после 1000 запросов и очень похоже что это никак не настраивается. Печаль...
Сделал еще один тест с параметром KEEP_PROCESS_ALIVE установленным в 0
Как и ожидалось - пакетная запись отработала без ошибок, но при этом все остальные тесты показали худшую производительность (что логично)
Пока готовил результаты тестов, начали терзать сомнения в том, что эта 1000 запросов прибита гвоздями в коде и не настраивается. Параметр есть, значит должно работать. А раз не работает, то...
Поискав строку "MAX_PROCESS_REQUESTS" в irbis_server.exe я ее не нашел. А если "MAX_PROCESS_REQUEST"?
Бинго! Есть такое!
Пишем MAX_PROCESS_REQUEST=100
Перезапускаем службу...
Запускаем тест...
Работает!
Чтобы три дня моих мучений не пропали даром, выкладываю результаты тестов.
Суть теста:
1. Есть база в которой 123330 записей
2. Читаем все записи (команда "G", с форматом &uf('+0') пачками по 100 записей
3. Обрабатываем (тут не суть важно что и как - главное что во всех вариантах это один и тот, же код)
4. Если запись изменилась, то сохраняем (во всех тестах сохраняется 16949 записей)
4.1 сохранение по одной записи - команда "D"
4.2 пакетное сохранение - команда "6" (накапливаем в буфер и отправляем на сервер одним запросом)
5. В конце, если сохраняли без актуализации, то актуализируем
Перед запуском теста база востанавливалась из архива, служба ИРБИСа перезапускалась
Тесты выполнялись однократно. С ИРБИСом в это время работали пользователи (поиск и чтение)
Варианты тестов:
1. Только чтение и обработка (без реальной записи в базу)
1.0 для KEEP_PROCESS_ALIVE=1 и MAX_PROCESS_REQUEST=60 чтение командой "C" (без указания формата)
1.1 для KEEP_PROCESS_ALIVE=0
1.2 для KEEP_PROCESS_ALIVE=1
2. Сохранение по одной записи (с актуализацией)
2.1 для KEEP_PROCESS_ALIVE=0
2.2 для KEEP_PROCESS_ALIVE=1
3. Сохранение по одной записи (без актуализации)
3.1 для KEEP_PROCESS_ALIVE=0
3.2 для KEEP_PROCESS_ALIVE=1
4. Пакетная запись, 60 записей в пакете (с актуализацией)
4.1 для KEEP_PROCESS_ALIVE=0
4.2 для KEEP_PROCESS_ALIVE=1
4.3 для KEEP_PROCESS_ALIVE=1 и MAX_PROCESS_REQUEST=100
4.3 для KEEP_PROCESS_ALIVE=1 и MAX_PROCESS_REQUEST=60 Пришлось уменьшить, а то снова упал
5. Пакетная запись, 60 записей в пакете (без актуализации)
5.1 для KEEP_PROCESS_ALIVE=0
5.2 для KEEP_PROCESS_ALIVE=1
5.3 для KEEP_PROCESS_ALIVE=1 и MAX_PROCESS_REQUEST=100
Результаты:
- Обработка/Актуализация/Общее - время в сек.
- Прирост - на сколько процентов изменилась скорость работы
Для тестов 1.* - относительно 1.1
Для остальных - относительно 2.2
- Замедление - на сколько замедляется запись относительно только чтения
- Записей/сек (в скобках - во сколько раз замедляется работа при записи)
- Память - объем памяти занимаемый процессом обработки перед завершением (по диспечеру задач)
Тест Обработка Актуализация Общее Прирост Замед. Записей/сек. Память
1.0 1058.40 - 1058.40 0 116 <15
1.1 140.31 - 140.31 87% 879 <15
1.2 104.12 - 104.12 91% 1184 <15
2.1 3324.49 - 3324.49 -19% 2369% 37(-23.8) <15
2.2 2789.06 - 2789.06 0 2679% 44(-26.9) ~650
3.1 2367.74 114.34 2482.08 11% 1769% 52(-16.9) <15
3.2 2078.46 124.68 2203.14 21% 2116% 59(-20.1) ~390
4.1 2417.63 - 2417.63 13% 1723% 51(-17.2) <80
4.2 ошибка выполнения >1900
4.3 ошибка выполнения >1900
4.4 2830.32 - 2830.32 -1% 2718% 43(-27.5) ~400..700
5.1 1743.25 114.97 1858.22 33% 1324% 70(-12.5) <30
5.2 ошибка выполнения >1900
5.3 2038.88 116.85 2155.73 23% 2070% 60(-19.7) ~800..1100
Выводы:
Вывод сделать очень сложно ибо тесты не совсем корректны. (Есть мысли как это сделать по умному,но нет времени)
Чтение - самый быстрый (как и ожидалось) это чтение пакетами (тест 1.2)
Запись. Тут не так все однозначно, но по имеющимся данным победитель - это вариант с пакетной записью без актуализации.
Очень странный результат для теста 4.4. Я ожидал, что он будет быстрее чем 4.1 и уж точно быстрее 2.2
Надеюсь это кому-то пригодится
Кстати - с утечками памяти надо что-то делать
И еще: какие еще способы есть для ускорения работы (записи в базу)? Может я не учел чего...