Забыл ответить про воркеров.<br>worker_processes&nbsp; 10;<br><br><br><div class="gmail_quote">2008/3/13 Igor Sysoev &lt;<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>&gt;:<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>
&gt; 2008/3/12 Igor Sysoev &lt;<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>&gt;:<br>
&gt;<br>
&gt; &gt; On Wed, Mar 12, 2008 at 04:00:55AM +0300, Alexander Zheglov wrote:<br>
&gt; &gt;<br>
&gt; &gt; &gt; Добрый день!<br>
&gt; &gt; &gt; Написал и использую модуль для ограничения количества запросов к серверу<br>
&gt; &gt; за<br>
&gt; &gt; &gt; промежуток времени с одного IP. Данные организованы следующим образом: в<br>
&gt; &gt; &gt; разделяемой памяти хранятся связанные списки структур статистики по ip<br>
&gt; &gt; &gt; адресам, нужная строка выбирается простой хеширующей функцией от ip<br>
&gt; &gt; адреса.<br>
&gt; &gt; &gt; Соответсвенно там происходит выделение и освобождение памяти. Для защиты<br>
&gt; &gt; &gt; указателей списка во время поиска по строке я использую<br>
&gt; &gt; pthread_mutex_lock<br>
&gt; &gt; &gt; на строку. Чтобы понятнее было:<br>
&gt; &gt; &gt; ..<br>
&gt; &gt; &gt; addr = ((struct sockaddr_in *)<br>
&gt; &gt; (r-&gt;connection-&gt;sockaddr))-&gt;sin_addr.s_addr;<br>
&gt; &gt; &gt; key = rlimit_hash_key(addr, ..);<br>
&gt; &gt; &gt; ..<br>
&gt; &gt; &gt; pthread_mutex_lock(&amp;ctx-&gt;hash_locks[key]);<br>
&gt; &gt; &gt; ..<br>
&gt; &gt; &gt; тут ищем статистику, в общем шаримся по разделяемой памяти<br>
&gt; &gt; &gt; ..<br>
&gt; &gt; &gt; ret = check_node(..);<br>
&gt; &gt; &gt; pthread_mutex_unlock(&amp;ctx-&gt;hash_locks[key]);<br>
&gt; &gt; &gt; return ret;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Обработчик устанавливается через:<br>
&gt; &gt; &gt; ..<br>
&gt; &gt; &gt; h = ngx_array_push(&amp;cmcf-&gt;phases[NGX_HTTP_PREACCESS_PHASE].handlers);<br>
&gt; &gt; &gt; ..<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Собственно вопрос в чем. Я печатаю статистику работы модуля и число<br>
&gt; &gt; &gt; процессов в критическом интервале все время равно нулю, несмотря на<br>
&gt; &gt; довольно<br>
&gt; &gt; &gt; значительную загрузку сервера. У меня складывается ощущение, что я<br>
&gt; &gt; чего-то<br>
&gt; &gt; &gt; не понимаю.<br>
&gt; &gt; &gt; То ли вообще нет необходимости в защите разделяемой памяти в этом месте,<br>
&gt; &gt; то<br>
&gt; &gt; &gt; ли это специфично только для freeBSD. Под Linux, увы, нет достаточно<br>
&gt; &gt; &gt; нагруженного сервера.<br>
&gt; &gt; &gt; Собственно вопрос, нужно ли здесь взаимное исключение процессов (нитей)?<br>
&gt; &gt; &gt; С уважением, Александр<br>
&gt; &gt; &gt; P.S. Если все таки нужно, не имеет ли смысл переделать на, скажем,<br>
&gt; &gt; семафоры?<br>
&gt; &gt;<br>
&gt; &gt; Где находится &amp;ctx-&gt;hash_locks[key] ? В разделяемой памяти ?<br>
&gt; &gt;<br>
&gt; &gt; Я для взаимного исключения процессов использую<br>
&gt; &gt; ngx_shmtx_lock()/ngx_shmtx_trylock/ngx_shmtx_unlock(),<br>
&gt; &gt; которые для i386/amd64/sparc64/ppc сейчас используют атомарные инструкции<br>
&gt; &gt; с уходом в sched_yield().<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; Добрый день, Игорь! Да, конечно в разделяемой. За основу я взял Ваш<br>
&gt; limit_zone, но некоторые решения для моей задачи мне показались не<br>
&gt; эффективными.<br>
&gt;<br>
&gt; Я старался по максимуму использовать api nginxа, нашел функции<br>
&gt; ngx_mutex_lock и тд, но в функции ngx_mutex_init выделение производится<br>
&gt; через ngx_alloc, так что я вернулся на стандартное api.<br>
<br>
</div></div>Нужно использовать не ngx_mutex_lock, а ngx_shmtx_lock().<br>
Он создаётся ngx_shmtx_create.<br>
<div class="Ih2E3d"><br>
&gt; Алексей Тутубалин мне уже ответил на заданные вопросы, было бы также очень<br>
&gt; интересно услышать Ваше мнение. Спасибо.<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>