Забыл ответить про воркеров.<br>worker_processes 10;<br><br><br><div class="gmail_quote">2008/3/13 Igor Sysoev <<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>>:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div><div></div><div class="Wj3C7c">On Wed, Mar 12, 2008 at 04:26:18PM +0300, Alexander Zheglov wrote:<br>
<br>
> 2008/3/12 Igor Sysoev <<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>>:<br>
><br>
> > On Wed, Mar 12, 2008 at 04:00:55AM +0300, Alexander Zheglov wrote:<br>
> ><br>
> > > Добрый день!<br>
> > > Написал и использую модуль для ограничения количества запросов к серверу<br>
> > за<br>
> > > промежуток времени с одного IP. Данные организованы следующим образом: в<br>
> > > разделяемой памяти хранятся связанные списки структур статистики по ip<br>
> > > адресам, нужная строка выбирается простой хеширующей функцией от ip<br>
> > адреса.<br>
> > > Соответсвенно там происходит выделение и освобождение памяти. Для защиты<br>
> > > указателей списка во время поиска по строке я использую<br>
> > pthread_mutex_lock<br>
> > > на строку. Чтобы понятнее было:<br>
> > > ..<br>
> > > addr = ((struct sockaddr_in *)<br>
> > (r->connection->sockaddr))->sin_addr.s_addr;<br>
> > > key = rlimit_hash_key(addr, ..);<br>
> > > ..<br>
> > > pthread_mutex_lock(&ctx->hash_locks[key]);<br>
> > > ..<br>
> > > тут ищем статистику, в общем шаримся по разделяемой памяти<br>
> > > ..<br>
> > > ret = check_node(..);<br>
> > > pthread_mutex_unlock(&ctx->hash_locks[key]);<br>
> > > return ret;<br>
> > ><br>
> > > Обработчик устанавливается через:<br>
> > > ..<br>
> > > h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);<br>
> > > ..<br>
> > ><br>
> > > Собственно вопрос в чем. Я печатаю статистику работы модуля и число<br>
> > > процессов в критическом интервале все время равно нулю, несмотря на<br>
> > довольно<br>
> > > значительную загрузку сервера. У меня складывается ощущение, что я<br>
> > чего-то<br>
> > > не понимаю.<br>
> > > То ли вообще нет необходимости в защите разделяемой памяти в этом месте,<br>
> > то<br>
> > > ли это специфично только для freeBSD. Под Linux, увы, нет достаточно<br>
> > > нагруженного сервера.<br>
> > > Собственно вопрос, нужно ли здесь взаимное исключение процессов (нитей)?<br>
> > > С уважением, Александр<br>
> > > P.S. Если все таки нужно, не имеет ли смысл переделать на, скажем,<br>
> > семафоры?<br>
> ><br>
> > Где находится &ctx->hash_locks[key] ? В разделяемой памяти ?<br>
> ><br>
> > Я для взаимного исключения процессов использую<br>
> > ngx_shmtx_lock()/ngx_shmtx_trylock/ngx_shmtx_unlock(),<br>
> > которые для i386/amd64/sparc64/ppc сейчас используют атомарные инструкции<br>
> > с уходом в sched_yield().<br>
> ><br>
> ><br>
> Добрый день, Игорь! Да, конечно в разделяемой. За основу я взял Ваш<br>
> limit_zone, но некоторые решения для моей задачи мне показались не<br>
> эффективными.<br>
><br>
> Я старался по максимуму использовать api nginxа, нашел функции<br>
> ngx_mutex_lock и тд, но в функции ngx_mutex_init выделение производится<br>
> через ngx_alloc, так что я вернулся на стандартное api.<br>
<br>
</div></div>Нужно использовать не ngx_mutex_lock, а ngx_shmtx_lock().<br>
Он создаётся ngx_shmtx_create.<br>
<div class="Ih2E3d"><br>
> Алексей Тутубалин мне уже ответил на заданные вопросы, было бы также очень<br>
> интересно услышать Ваше мнение. Спасибо.<br>
<br>
</div>Что показывает ldd nginx, сколько используется воркеров ?<br>
<font color="#888888"><br>
<br>
--<br>
</font><div><div></div><div class="Wj3C7c">Игорь Сысоев<br>
<a href="http://sysoev.ru" target="_blank">http://sysoev.ru</a><br>
<br>
</div></div></blockquote></div><br>