Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev ][Date Next ][Thread Prev ][Thread Next ][Date Index ][Thread Index ]
Re[2]: nginx 0.3.7 & rtsig
On Wed, 2 Nov 2005, Eugeny Zadevalov wrote:
Полностью подтверждаю.
Ядро тоже редхат только 2.4.21-37.ELsmp.
Также важная поправка, я апгрейдился с nginx-0.2.4 в котором глюка не было.
Игорь, второй день наблюдаю одну и ту же ситуацию.
Обновился до 0.3.7. Через сутки работы nginx "зависает", т.е. не
обрабатывает приходящие запросы.
Кроме того он перестает реагировать на какие-либо сигналы, кроме kill -9
В качестве метода используется rtsig.
В среднем 400-500 активных соединений.
Linux 2.4.20-31.9.progeny.5smp
Данная ситуация повторялась несколько суток, сегодня это уже второй раз за 12
часов.
Когда nginx "зависает", в логи ничего не пишет.
Прилагаемый патч, возможно, решит эту проблему.
Игорь Сысоев
http://sysoev.ru --- src/event/modules/ngx_rtsig_module.c Thu Oct 20 12:10:07 2005
+++ src/event/modules/ngx_rtsig_module.c Wed Nov 2 09:09:08 2005
@@ -288,7 +288,7 @@
ngx_int_t instance;
ngx_err_t err;
siginfo_t si;
- ngx_event_t *rev, *wev;
+ ngx_event_t *rev, *wev, **queue;
struct timespec ts, *tp;
struct sigaction sa;
ngx_connection_t *c;
@@ -381,15 +381,32 @@
}
if ((si.si_band & (POLLIN|POLLHUP|POLLERR)) && rev->active) {
+
rev->ready = 1;
- rev->handler(rev);
+
+ if (flags & NGX_POST_EVENTS) {
+ queue = (ngx_event_t **) (rev->accept ?
+ &ngx_posted_accept_events : &ngx_posted_events);
+
+ ngx_locked_post_event(rev, queue);
+
+ } else {
+ rev->handler(rev);
+ }
}
wev = c->write;
if ((si.si_band & (POLLOUT|POLLHUP|POLLERR)) && wev->active) {
+
wev->ready = 1;
- wev->handler(wev);
+
+ if (flags & NGX_POST_EVENTS) {
+ ngx_locked_post_event(wev, &ngx_posted_events);
+
+ } else {
+ wev->handler(wev);
+ }
}
return NGX_OK;
--- src/event/ngx_event.c Fri Oct 21 18:51:49 2005
+++ src/event/ngx_event.c Wed Nov 2 09:02:04 2005
@@ -48,6 +48,7 @@
ngx_atomic_t *ngx_accept_mutex_ptr;
+ngx_atomic_t *ngx_accept_mutex_last_owner;
ngx_atomic_t *ngx_accept_mutex;
ngx_uint_t ngx_accept_mutex_held;
ngx_msec_t ngx_accept_mutex_delay;
@@ -249,10 +250,6 @@
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"timer delta: %M", delta);
- if (delta) {
- ngx_event_expire_timers();
- }
-
if (ngx_posted_accept_events) {
ngx_event_process_posted(cycle, &ngx_posted_accept_events);
}
@@ -261,6 +258,10 @@
*ngx_accept_mutex = 0;
}
+ if (delta) {
+ ngx_event_expire_timers();
+ }
+
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"posted events %p", ngx_posted_events);
@@ -470,6 +471,7 @@
/* TODO: adjust cache line size, 128 is P4 cache line size */
size = 128 /* ngx_accept_mutex */
+ + 128 /* ngx_accept_mutex_last_owner */
+ 128; /* ngx_connection_counter */
#if (NGX_STAT_STUB)
@@ -489,16 +491,17 @@
}
ngx_accept_mutex_ptr = (ngx_atomic_t *) shared;
- ngx_connection_counter = (ngx_atomic_t *) (shared + 128);
+ ngx_accept_mutex_last_owner = (ngx_atomic_t *) (shared + 1 * 128);
+ ngx_connection_counter = (ngx_atomic_t *) (shared + 2 * 128);
#if (NGX_STAT_STUB)
- ngx_stat_accepted = (ngx_atomic_t *) (shared + 2 * 128);
- ngx_stat_handled = (ngx_atomic_t *) (shared + 3 * 128);
- ngx_stat_requests = (ngx_atomic_t *) (shared + 4 * 128);
- ngx_stat_active = (ngx_atomic_t *) (shared + 5 * 128);
- ngx_stat_reading = (ngx_atomic_t *) (shared + 6 * 128);
- ngx_stat_writing = (ngx_atomic_t *) (shared + 7 * 128);
+ ngx_stat_accepted = (ngx_atomic_t *) (shared + 3 * 128);
+ ngx_stat_handled = (ngx_atomic_t *) (shared + 4 * 128);
+ ngx_stat_requests = (ngx_atomic_t *) (shared + 5 * 128);
+ ngx_stat_active = (ngx_atomic_t *) (shared + 6 * 128);
+ ngx_stat_reading = (ngx_atomic_t *) (shared + 7 * 128);
+ ngx_stat_writing = (ngx_atomic_t *) (shared + 8 * 128);
#endif
--- src/event/ngx_event.h Mon Oct 17 22:35:20 2005
+++ src/event/ngx_event.h Wed Nov 2 09:25:48 2005
@@ -438,6 +438,7 @@
extern ngx_atomic_t *ngx_connection_counter;
extern ngx_atomic_t *ngx_accept_mutex_ptr;
+extern ngx_atomic_t *ngx_accept_mutex_last_owner;
extern ngx_atomic_t *ngx_accept_mutex;
extern ngx_uint_t ngx_accept_mutex_held;
extern ngx_msec_t ngx_accept_mutex_delay;
@@ -474,8 +475,6 @@
void ngx_event_accept(ngx_event_t *ev);
ngx_int_t ngx_trylock_accept_mutex(ngx_cycle_t *cycle);
-ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle);
-ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle);
u_char *ngx_accept_log_error(ngx_log_t *log, u_char *buf, size_t len);
--- src/event/ngx_event_accept.c Wed Oct 12 12:21:38 2005
+++ src/event/ngx_event_accept.c Wed Nov 2 09:42:33 2005
@@ -13,6 +13,8 @@
#define NGX_SOCKLEN 512
+static ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle);
+static ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle);
static void ngx_close_accepted_connection(ngx_connection_t *c);
@@ -262,15 +264,20 @@
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"accept mutex locked");
- if (!ngx_accept_mutex_held) {
- if (ngx_enable_accept_events(cycle) == NGX_ERROR) {
- *ngx_accept_mutex = 0;
- return NGX_ERROR;
- }
+ if (ngx_accept_mutex_held
+ && (!(ngx_event_flags & NGX_USE_RTSIG_EVENT)
+ || *ngx_accept_mutex_last_owner == (ngx_atomic_t) ngx_pid))
+ {
+ return NGX_OK;
+ }
- ngx_accept_mutex_held = 1;
+ if (ngx_enable_accept_events(cycle) == NGX_ERROR) {
+ *ngx_accept_mutex = 0;
+ return NGX_ERROR;
}
+ ngx_accept_mutex_held = 1;
+
return NGX_OK;
}
@@ -286,7 +293,7 @@
}
-ngx_int_t
+static ngx_int_t
ngx_enable_accept_events(ngx_cycle_t *cycle)
{
ngx_uint_t i;
@@ -299,10 +306,17 @@
c = ls[i].connection;
if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
+
+ if (ngx_accept_mutex_held) {
+ c->read->disabled = 1;
+ }
+
if (ngx_add_conn(c) == NGX_ERROR) {
return NGX_ERROR;
}
+ *ngx_accept_mutex_last_owner = ngx_pid;
+
} else {
if (ngx_add_event(c->read, NGX_READ_EVENT, 0) == NGX_ERROR) {
return NGX_ERROR;
@@ -314,7 +328,7 @@
}
-ngx_int_t
+static ngx_int_t
ngx_disable_accept_events(ngx_cycle_t *cycle)
{
ngx_uint_t i;