Discussion:
Странная ситуация с levels
CoDDoC
2018-11-09 07:18:30 UTC
Permalink
nginx-debug -v
nginx version: nginx/1.15.6

СпецОальМП ПбМПвОлся, ЎП этПгП была версОя 1.13.12, таЌ тП же саЌПе.
ИзЌеМеМОе levels в proxy_cache_path прОЌеМяется тПлькП пПсле пПлМПгП рестарта (service nginx-debug restart)
nginx-debug -s reload ПжОЎаеЌПгП результата Ме Ўает

Как вПспрПОзвестО:
1. В кПМтексте http:
proxy_cache_path /var/www/html/cache levels=1:2:1 use_temp_path=off keys_zone=testcache:5m inactive=10m max_size=50m;
2. service nginx-debug restart
3. В error.log:
cache manager process <PID> exited with code 0
start cache manager process <PID>
start cache loader process <PID>
4. Делаю запрПс в лПкейшеМ, Ўля кПтПрПгП актОвОрПваМа зПМа testcache
5. ППлучаю ПжОЎаеЌПе:
/var/www/html/cache/3/05/8/e62d74fdc44e220f0225168323c28053
6. УЎаляю ветку '3/05/8/e62d74fdc44e220f0225168323c28053'

7. МеМяю levels 1:2:1 -> levels 1
8. nginx-debug -s reload
9. В error.log:
cache "testcache" had previously different levels
10. ЗапрПс в тПт же лПкейшеМ Ўает тПт же результат:
/var/www/html/cache/3/05/8/e62d74fdc44e220f0225168323c28053
11. Опять уЎаляю '3/05/8/e62d74fdc44e220f0225168323c28053'
12. service nginx-debug restart
13. В error.log:
cache manager process <PID> exited with code 0
start cache manager process <PID>
start cache loader process <PID>
14. ЗапрПс в тПт же лПкейшеМ Ппять Ўает ПжОЎаеЌПе:
/var/www/html/cache/3/e62d74fdc44e220f0225168323c28053

ЕслО этП МПрЌальМПе пПвеЎеМОе, ЌПжет, ОЌеет сЌысл как-тП ПтЌетОть в ЎПкуЌеМтацОО МеПбхПЎОЌПсть рестарта?

СпасОбП.
--
Maxim Dounin
2018-11-09 13:33:59 UTC
Permalink
Hello!
Post by CoDDoC
nginx-debug -v
nginx version: nginx/1.15.6
Специально обновился, до этого была версия 1.13.12, там то же самое.
Изменение levels в proxy_cache_path применяется только после полного рестарта (service nginx-debug restart)
nginx-debug -s reload ожидаемого результата не дает
proxy_cache_path /var/www/html/cache levels=1:2:1 use_temp_path=off keys_zone=testcache:5m inactive=10m max_size=50m;
2. service nginx-debug restart
cache manager process <PID> exited with code 0
start cache manager process <PID>
start cache loader process <PID>
4. Делаю запрос в локейшен, для которого активирована зона testcache
/var/www/html/cache/3/05/8/e62d74fdc44e220f0225168323c28053
6. Удаляю ветку '3/05/8/e62d74fdc44e220f0225168323c28053'
7. Меняю levels 1:2:1 -> levels 1
8. nginx-debug -s reload
cache "testcache" had previously different levels
/var/www/html/cache/3/05/8/e62d74fdc44e220f0225168323c28053
11. Опять удаляю '3/05/8/e62d74fdc44e220f0225168323c28053'
12. service nginx-debug restart
cache manager process <PID> exited with code 0
start cache manager process <PID>
start cache loader process <PID>
/var/www/html/cache/3/e62d74fdc44e220f0225168323c28053
Если это нормальное поведение, может, имеет смысл как-то отметить в документации необходимость рестарта?
Это нормальное поведение.

Многие вещи, работа с которыми происходит через зоны разделяемой
памяти из всех процессов, поменять без пересоздания зоны
разделяемой памяти - нельзя. Наиболее банальный пример - нельзя
поменять собственно размер зоны разделяемой памяти.

В чуть более сложных случаях - нельзя менять параметры, которые
меняют поведение рабочих процессов на несовместимое с другими
рабочими процессами или с уже имеющейся в разделяемой памяти
информацией. В частности, levels в кэше - определяют, в каком
именно виде лежат данные на диске, и каким именно файлам на диске
соответствуют элементы в разделяемой памяти. То есть поменять
levels просто так нельзя - фактически, надо выкинуть из памяти всю
информацию, которая становится негодной, и презагрузить содержимое
кэша заново. Кроме того, всё ещё осложняется тем, что у нас есть
старые рабочи процессы, которые могут работать неопределённо
долго, и эти рабочие процессы предполагают старое значение levels, то
есть если мы таки выкинем и перезагрузим содержимое разделяемой
памяти - начнут вести себя некорретно они.

Чтобы подобных проблем не возникало - при применении новой
конфигурации nginx проверяет, что конфигурация совместима с тем,
как использовались зоны разделяемой памяти ранее. И если
обнаруживает, что попытались поменять что-то, что менять нельзя -
логгирует соответствующую ошибку в error log, и откатывается к
старой конфигурации.

Если тем не менее хочется соответствующие параметры поменять, то
это можно сделать одним из следующих способов:

- Переименовать зону разделяемой памяти (в случае кэша - лучше
при этом заодно задать новый путь), и использовать её в
конфигурации с новыми параметрами. При таком изменении
конфликтов между старой и новой конфигурацией не будет, можно
будет сделать reload. И при этом сохранится содержимое
остальных зон разделяемой памяти, конфигурацию которых не меняли.

- Сделать binary upgrade. При этом все зоны разделяемой памяти будут
созданы заново, однако потерь запросов не будет.

- Ну и собственно сделать restart. Всё тоже заработает с новой
конфигурацией, но смысла в этом приблизительно никакого - binary
upgrade даст тот же результат, но без потери запросов.
--
Maxim Dounin
http://mdounin.ru/
CoDDoC
2018-11-10 13:27:35 UTC
Permalink
Да, спасОбП.
ДП переОЌеМПваМОя зПМы я уже ЎПгаЎался.
НП Ме сразу заЌетОл. ЭксперОЌеМтОрПвал с ЎПвПльМП слПжМыЌ SSI, прОшлПсь частП загляЎывать в кэш, ЌМПгПурПвМевый Пказался МеуЎПбеМ, переключОл в ПЎОМ урПвеМь, вПт тПлькП тПгЎа. ППтПЌ уже пПлез в Ўебаг.

Себе в шпаргалку Ма заЌетку. НП все-такО, МеплПхП былП бы сказать в ЎПке П рестарте (ИМХО).
Post by Maxim Dounin
Hello!
Post by CoDDoC
nginx-debug -v
nginx version: nginx/1.15.6
СпецОальМП ПбМПвОлся, ЎП этПгП была версОя 1.13.12, таЌ тП же саЌПе.
ИзЌеМеМОе levels в proxy_cache_path прОЌеМяется тПлькП пПсле пПлМПгП рестарта (service nginx-debug restart)
nginx-debug -s reload ПжОЎаеЌПгП результата Ме Ўает
proxy_cache_path /var/www/html/cache levels=1:2:1 use_temp_path=off keys_zone=testcache:5m inactive=10m max_size=50m;
2. service nginx-debug restart
cache manager process <PID> exited with code 0
start cache manager process <PID>
start cache loader process <PID>
4. Делаю запрПс в лПкейшеМ, Ўля кПтПрПгП актОвОрПваМа зПМа testcache
/var/www/html/cache/3/05/8/e62d74fdc44e220f0225168323c28053
6. УЎаляю ветку '3/05/8/e62d74fdc44e220f0225168323c28053'
7. МеМяю levels 1:2:1 -> levels 1
8. nginx-debug -s reload
cache "testcache" had previously different levels
/var/www/html/cache/3/05/8/e62d74fdc44e220f0225168323c28053
11. Опять уЎаляю '3/05/8/e62d74fdc44e220f0225168323c28053'
12. service nginx-debug restart
cache manager process <PID> exited with code 0
start cache manager process <PID>
start cache loader process <PID>
/var/www/html/cache/3/e62d74fdc44e220f0225168323c28053
ЕслО этП МПрЌальМПе пПвеЎеМОе, ЌПжет, ОЌеет сЌысл как-тП ПтЌетОть в ЎПкуЌеМтацОО МеПбхПЎОЌПсть рестарта?
ЭтП МПрЌальМПе пПвеЎеМОе.
ММПгОе вещО, рабПта с кПтПрыЌО прПОсхПЎОт через зПМы разЎеляеЌПй
паЌятО Оз всех прПцессПв, пПЌеМять без пересПзЎаМОя зПМы
разЎеляеЌПй паЌятО - Мельзя. НаОбПлее баМальМый прОЌер - Мельзя
пПЌеМять сПбствеММП разЌер зПМы разЎеляеЌПй паЌятО.
В чуть бПлее слПжМых случаях - Мельзя ЌеМять параЌетры, кПтПрые
ЌеМяют пПвеЎеМОе рабПчОх прПцессПв Ма МесПвЌестОЌПе с ЎругОЌО
рабПчОЌО прПцессаЌО ОлО с уже ОЌеющейся в разЎеляеЌПй паЌятО
ОМфПрЌацОей. В частМПстО, levels в кэше - ПпреЎеляют, в какПЌ
ОЌеММП вОЎе лежат ЎаММые Ма ЎОске, О какОЌ ОЌеММП файлаЌ Ма ЎОске
сППтветствуют элеЌеМты в разЎеляеЌПй паЌятО. ТП есть пПЌеМять
levels прПстП так Мельзя - фактОческО, МаЎП выкОМуть Оз паЌятО всю
ОМфПрЌацОю, кПтПрая стаМПвОтся МегПЎМПй, О презагрузОть сПЎержОЌПе
кэша заМПвП. КрПЌе тПгП, всё ещё ПслПжМяется теЌ, чтП у Мас есть
старые рабПчО прПцессы, кПтПрые ЌПгут рабПтать МеПпреЎелёММП
ЎПлгП, О этО рабПчОе прПцессы преЎпПлагают старПе зМачеМОе levels, тП
есть еслО Ќы такО выкОМеЌ О перезагрузОЌ сПЎержОЌПе разЎеляеЌПй
паЌятО - МачМут вестО себя МекПрретМП ПМО.
ЧтПбы пПЎПбМых прПблеЌ Ме вПзМОкалП - прО прОЌеМеМОО МПвПй
кПМфОгурацОО nginx прПверяет, чтП кПМфОгурацОя сПвЌестОЌа с теЌ,
как ОспПльзПвалОсь зПМы разЎеляеЌПй паЌятО раМее. И еслО
ПбМаружОвает, чтП пПпыталОсь пПЌеМять чтП-тП, чтП ЌеМять Мельзя -
лПггОрует сППтветствующую ПшОбку в error log, О Пткатывается к
старПй кПМфОгурацОО.
ЕслО теЌ Ме ЌеМее хПчется сППтветствующОе параЌетры пПЌеМять, тП
- ПереОЌеМПвать зПМу разЎеляеЌПй паЌятО (в случае кэша - лучше
  прО этПЌ заПЎМП заЎать МПвый путь), О ОспПльзПвать её в
  кПМфОгурацОО с МПвыЌО параЌетраЌО. ПрО такПЌ ОзЌеМеМОО
  кПМфлОктПв ЌежЎу старПй О МПвПй кПМфОгурацОей Ме буЎет, ЌПжМП
  буЎет сЎелать reload. И прО этПЌ сПхраМОтся сПЎержОЌПе
  ПстальМых зПМ разЎеляеЌПй паЌятО, кПМфОгурацОю кПтПрых Ме ЌеМялО.
- СЎелать binary upgrade. ПрО этПЌ все зПМы разЎеляеЌПй паЌятО буЎут
  сПзЎаМы заМПвП, ПЎМакП пПтерь запрПсПв Ме буЎет.
- Ну О сПбствеММП сЎелать restart. Всё тПже зарабПтает с МПвПй
  кПМфОгурацОей, МП сЌысла в этПЌ прОблОзОтельМП МОкакПгП - binary
  upgrade Ўаст тПт же результат, МП без пПтерО запрПсПв.
--
Maxim Dounin
http://mdounin.ru/
_______________________________________________
nginx-ru mailing list
http://mailman.nginx.org/mailman/listinfo/nginx-ru
--

Loading...