Проблема с памятью в самописных модулях

Alexey N. Kovyrin alexey at kovyrin.net
Mon Jan 30 16:19:10 MSK 2006


Добрый день,

Опять пишу к Игорю, но, для потомков, через лист :-)

Итак, всплыли такие проблемы:

1) В одном из самописных модулей используется некое подобие "базы 
данных" - бинарный файл, загружаемый в момент инициализации в память...
Делается это так:

ngx_http_banner_conf_t  *bcf;
...
bcf = ngx_palloc(cf->pool, sizeof(ngx_http_banner_conf_t));
bcf->girls = ngx_palloc(cf->pool, file_info.st_size);
...
... read(db_handle,  bcf->girls, file_info.st_size) ...

И, в том же модуле, используется MindMax GeoIP (City)... он тоже 
инициализируется при инициализации модуля:

bcf->gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV1, GEOIP_STANDARD);

Проблема: сервер очень часто дергается через HUP для обновления конфига 
с виртхостами (которых сейчас около 10000)... после каждого обновления 
конфигов всех процессы nginxа вырастают в памяти на 1-2 мб....

2) Возможно, в связи с проблемой номер 1, через некоторое время рабочие 
процессы начинают умирать...
Анализ core показывает:
Core was generated by `nginx: worker process'.
Program terminated with signal 11, Segmentation fault.

#0  0x0804d087 in ngx_chain_update_chains (free=0xe83c2d8, busy=0xe83c2dc,
    out=0xbffff9c8, tag=0x8080940) at src/core/ngx_buf.c:200
200             if (ngx_buf_size((*busy)->buf) != 0) {

(gdb) bt
#0  0x0804d087 in ngx_chain_update_chains (free=0xe83c2d8, busy=0xe83c2dc,
    out=0xbffff9c8, tag=0x8080940) at src/core/ngx_buf.c:200
#1  0x0804d220 in ngx_output_chain (ctx=0xe83c2d0, in=0x35)
    at src/core/ngx_output_chain.c:223
#2  0x0806ee83 in ngx_http_range_body_filter (r=0xb579408, in=0xe83c390)
    at src/http/modules/ngx_http_range_filter_module.c:587
#3  0x0805eb81 in ngx_http_output_filter (r=0xb579408, in=0xbffff838)
    at src/http/ngx_http_core_module.c:979
#4  0x08062f96 in ngx_http_finalize_request (r=0xb579408, rc=400)
    at src/http/ngx_http_request.c:1436
#5  0x08061ea5 in ngx_http_process_request_line (rev=0x405c4c5c)
    at src/http/ngx_http_request.c:721
#6  0x08055989 in ngx_event_process_posted (cycle=0x11e8b028, 
posted=0x8085718)
    at src/event/ngx_event_posted.c:39
#7  0x0805490e in ngx_process_events_and_timers (cycle=0x11e8b028)
    at src/event/ngx_event.c:272
#8  0x0805a7df in ngx_worker_process_cycle (cycle=0x11e8b028, data=0x0)
    at src/os/unix/ngx_process_cycle.c:728
#9  0x08058cec in ngx_spawn_process (cycle=0x11e8b028,
    proc=0x805a799 <ngx_worker_process_cycle>, data=0x0,
    name=0x8078b57 "worker process", respawn=-3)
    at src/os/unix/ngx_process.c:187
#10 0x0805a1c6 in ngx_start_worker_processes (cycle=0x11e8b028, n=4, 
type=-3)
---Type <return> to continue, or q <return> to quit---
    at src/os/unix/ngx_process_cycle.c:327
#11 0x08059c8f in ngx_master_process_cycle (cycle=0x11e8b028)
    at src/os/unix/ngx_process_cycle.c:219
#12 0x0804a526 in main (argc=29, argv=0xbffff838) at src/core/nginx.c:306

После смерти всех процессов nginx продолжает принимать соединения 
(насколько я понял), но все они уже ничего отдать не могут....


P.S. Насчет geoip... а как мне можно освобождать память, которую он 
выделяет (только сейчас в голову пришло, что он тоже вполне имеет право 
на это)?

-- 
/Scoundrel    [http://kovyrin.info]






More information about the nginx-ru mailing list