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