Проблема с памятью в самописных модулях
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