Re: Geo проблема

Igor Sysoev igor на sysoev.ru
Ср Авг 24 08:09:37 UTC 2011


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

> 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К.


-- 
Игорь Сысоев
http://sysoev.ru



Подробная информация о списке рассылки nginx-ru