Re: Geo проблема
Konstantin Svist
fry.kun на gmail.com
Ср Авг 24 11:47:38 UTC 2011
On 08/24/2011 01:09 AM, Igor Sysoev wrote:
> On Tue, Aug 23, 2011 at 06:36:44PM -0700, Konstantin Svist wrote:
>> У меня почему-то Geo ест слишком много памяти.
>>
>> Без Geo (top):
>>
>> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
>> 6324 nobody 20 0 287m 52m 2052 S 0.0 0.2 0:00.03 nginx:
>> worker process
>> 6304 root 20 0 284m 47m 524 S 0.0 0.1 0:00.02 nginx:
>> master process /usr/local/nginx/sbin/nginx -c
>> /usr/local/nginx/conf/nginx.conf
>>
>> Когда добавляю Geo:
>>
>> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
>> 8151 nobody 20 0 668m 437m 6036 S 25.6 1.4 0:27.91 nginx:
>> worker process
>> 8113 root 20 0 664m 427m 572 S 0.0 1.3 0:00.28 nginx:
>> master process /usr/local/nginx/sbin/nginx -c
>> /usr/local/nginx/conf/nginx.conf
>>
>> А если сделать kill -HUP, то ещё хуже:
>>
>> PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
>> 28811 nobody 20 0 1213m 984m 8188 S 23.7 3.0 2109:47 nginx:
>> worker process
>> 2721 root 20 0 1213m 978m 2548 S 0.0 3.0 0:37.95 nginx:
>> master process /usr/local/nginx/sbin/nginx -c
>> /usr/local/nginx/conf/nginx.conf
>>
>>
>>
>> nginx.conf:
>>
>> http {
>> geo $ip_blocklist_in $ip_blocklist_out {
>> default "OK";
>> include ipblocklist.conf;
>> }
>> proxy_set_header Custom-Ip-Blocklist $ip_blocklist_out;
>> fastcgi_param HTTP_CUSTOM_IP_BLOCKLIST $ip_blocklist_out;
>> ...
>> server { # большинство таких (~20) - не пользую Geo
>> ...
>> }
>> server { # 2 таких - не пользую Geo
>> set $ip_blocklist_in '';
>> ...
>> }
>> server { # 1 такой - пользую Geo
>> location /xyz {
>> set $ip_blocklist_in $arg_i; # client passes IP as
>> url param
>> ...
>> }
>> ...
>> }
>> server { # 4 таких - пользую Geo
>> set $ip_blocklist_in $arg_i; # client passes IP as url param
>> ...
>> }
>> }
> Замечание, не имеющее отношение к проблеме: вместо set лучше сразу делать
> geo $arg_i $ip_blocklist_out
Это для того чтобы менять от одного клиента к другому. Один посылает i=,
другой ip=...
>
>> ipblocklist.conf:
>>
>> 10.10.10.111 ab|bc;
>> 10.10.10.189 ab|bc;
>> 10.10.252.101 bc|defg;
>> 10.100.10.100 ab|bc|defg;
>> ...
>>
>> ~670,000 линий, всего 13M на диске.
> На один бит в дереве radix расходуется 32 байта (для 64-битной архитектры).
> На 32-битный адрес - 1024 байта, то есть, килобайт. Первые биты общие
> для многих адресов. Сколько адреса займут памяти, грубо можно оценить так:
> например, если у нас есть 670,000 адресов, отличающихся только последними
> 16-ти битами (что, скорее всего, достаточно близко к приведённому случаю),
> то они займут около:
>
> 4*8*16*670000 = 327M
>
> Для последних 8-ми бит:
>
> 4*8*8*670000 = 163M
>
> Вообще, geo лучше использует память для CIDR'ов, например, 10.10.10.0/24;
> В этом случае последние 8 бит не хранятся, сохраняя 8К.
>
>
Система 64 битовая. Список представляется мне разорванный (не CIDRовый),
но вроде все биты меняются.
Надеялся что более компактно держится в памяти.
Ну а почему удваивается память при HUP?
Подробная информация о списке рассылки nginx-ru