ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


  • To: nginx <nginx-ru@xxxxxxxxx>
  • Subject: Проблема с памятью в самописных модулях
  • From: "Alexey N. Kovyrin" <alexey@xxxxxxxxxxx>
  • Date: Mon, 30 Jan 2006 15:19:10 +0200

Добрый день,

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

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

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]




 




Copyright © Lexa Software, 1996-2009.