Параметр -G
Параметр -G
В одном из топиков было сказано, что использовать -G 0 - плохая привычка. Объясните, пожалуйста, на что влияет этот параметр на практике? А то по доке непонятно, на чем отражается эта Before-image Cluster Age. Можно ли использовать, например, proutil truncate bi -G 0, чтобы сократить время ожидания, когда команда начнет работать? Что может сломаться?
Re: Параметр -G
Параметр -G используется в трех разных ситуациях:
1) При crash recovery для определения стартого кластера, с которого начинается redo фаза.
2) При работе базы определяет время, после которого можно повторно использовать bi кластер. Кластер должен быть не "моложе" чем max(-G, 60).
3) При усечении bi файла задает интервал времени, которое утилита должна подождать после завершения процесса crash recovery прежде чем удалить старый bi файл и создать новый.
Во всех трех случаях таймаут нужен из-за того, что в db файлы Progress пишет в асинхронной (буферизированной) моде, т.е. дается команда записать, данные копируются в системный кэш и процесс не ждет их актуального сохранения на диск.
Например использование -G 0 при truncate bi может привести к тому, что если не повезет и сразу после выполнения этой команды операционная система рухнет, то данные в системном кэше будут потерены, а bi файл, по которому их можно было бы восстановить во время crash recovery, уже удален. Т.е. база будет повреждена.
Значение параметра -G по умолчанию составляет 60 секунд. Это означает, что Progress предполагает, что за это время все данные из системного кэша будут сброшены на диск. Progress подталкивает операционную систему к этому через системный вызов sync(). Кстати сам по себе вызов sync на некоторых ОС не гарантирует завершение сброса буферов. ОС также обычно запущен демон, который вызывает функцию sync по-умолчанию каждые 30 секунд.
Резюме - использовать параметр -G со значением меньшим чем значение по умолчанию можно только на базе, которая значит для вас меньше чем те "лишние" 60 секунд, которые truncate bi ждет перед завершением.
Кстати с параметром -directio, с которым Progress пишет в db файлы в синхронном режиме, т.е. когда вызов write() ожидает актуального сохранения данных на диск, таймаут -G становиться несущественным. Однако Progress все равно использует ненулевое значение для -G.
Такая команда безопасна:
proutil db -C truncate bi -directio -G 0
Однако насколько при этом замедлится процесс crash recovery после падения базы во время ее транзакционно активной работы - затрудняюсь оценить.
<Переносим в F.A.Q.?>
Кстати для команды "proutil db -C dbanalys -G 0" параметр -G имеет смысл только всмысле 1), если, конечно, утилита запускается в offline. Т.е. здесь смысла в использовании -G 0 вообще-то нет.
1) При crash recovery для определения стартого кластера, с которого начинается redo фаза.
2) При работе базы определяет время, после которого можно повторно использовать bi кластер. Кластер должен быть не "моложе" чем max(-G, 60).
3) При усечении bi файла задает интервал времени, которое утилита должна подождать после завершения процесса crash recovery прежде чем удалить старый bi файл и создать новый.
Во всех трех случаях таймаут нужен из-за того, что в db файлы Progress пишет в асинхронной (буферизированной) моде, т.е. дается команда записать, данные копируются в системный кэш и процесс не ждет их актуального сохранения на диск.
Например использование -G 0 при truncate bi может привести к тому, что если не повезет и сразу после выполнения этой команды операционная система рухнет, то данные в системном кэше будут потерены, а bi файл, по которому их можно было бы восстановить во время crash recovery, уже удален. Т.е. база будет повреждена.
Значение параметра -G по умолчанию составляет 60 секунд. Это означает, что Progress предполагает, что за это время все данные из системного кэша будут сброшены на диск. Progress подталкивает операционную систему к этому через системный вызов sync(). Кстати сам по себе вызов sync на некоторых ОС не гарантирует завершение сброса буферов. ОС также обычно запущен демон, который вызывает функцию sync по-умолчанию каждые 30 секунд.
Резюме - использовать параметр -G со значением меньшим чем значение по умолчанию можно только на базе, которая значит для вас меньше чем те "лишние" 60 секунд, которые truncate bi ждет перед завершением.
Кстати с параметром -directio, с которым Progress пишет в db файлы в синхронном режиме, т.е. когда вызов write() ожидает актуального сохранения данных на диск, таймаут -G становиться несущественным. Однако Progress все равно использует ненулевое значение для -G.
Такая команда безопасна:
proutil db -C truncate bi -directio -G 0
Однако насколько при этом замедлится процесс crash recovery после падения базы во время ее транзакционно активной работы - затрудняюсь оценить.
<Переносим в F.A.Q.?>
Кстати для команды "proutil db -C dbanalys -G 0" параметр -G имеет смысл только всмысле 1), если, конечно, утилита запускается в offline. Т.е. здесь смысла в использовании -G 0 вообще-то нет.
re:Параметр -G
Да, я думаю, полезно это пометить в FAQ. Заодно и еще один вопрос-ответ туда:
В каких случаях нужно использовать -directio ? В советах на оптимизации производительности (не помню, где) читал, что стоит включить этот параметр при старте сервера, т.к. без него будет выполняться двухуровневое кеширование - в кеше сервера БД и в дисковом кеше ОС. Так ли это?
В каких случаях нужно использовать -directio ? В советах на оптимизации производительности (не помню, где) читал, что стоит включить этот параметр при старте сервера, т.к. без него будет выполняться двухуровневое кеширование - в кеше сервера БД и в дисковом кеше ОС. Так ли это?
Re: re:Параметр -G
Последний раз редактировалось George 11 мар 2005, 11:20, всего редактировалось 1 раз.