nginx-1.2.5

Anton Yuzhaninov citrin at citrin.ru
Thu Nov 15 09:54:44 UTC 2012


On 11/14/12 21:44, Maxim Dounin wrote:
> Но, честно говоря, я так подозреваю, что даже цифры выше - это,
> скорее всего, далеко не просто стоимость инструкций, а результат
> выбрасывания нужных данных из кеша процессоров из-за обновления
> счётчика (читай: cache line flush'ился, и route entry при других к
> ней обращениях приходилось перегружать из памяти).  В этом месте
> nginx поступает как правильно, и счётчики держит отдельно от
> всего, да ещё и с отступом в cache line между ними.

Сама по себе операция изменения счетчика, разумеется очень дешевая. Весь эффект, 
из за необходимости синхронизации кэшей CPU.
После того, как счетчик инкрементирован он сначала попадает только в локальный 
кэш CPU. Если потом код работающий на другом CPU захочет инкрементировать этот 
же счетчик, он должен будет подождать, пока первый CPU запишет эти данные в main 
memory, и потом прочитть их оттуда. Для того, чтобы узнать сосотяние кэша (нужно 
ли ждать и сколько ждать) используются разные протоколы для обеспечения cache 
coherency, но почти все плохо масштабируются с увеличенимем числа кэшей. В итоге 
при достаточно большом числе процессоров и ядер даже простой инкремент общего на 
много CPU счетчика может стать узким местом.

В случае nginx наверно измеримого эффекта не будет - счетчики инкрементируются 
относительно редко, на один http запрос выполняется много разной работы.

Но теоретически будет немного быстрее, если каждый воркер будет писать в свою 
облать памяти, а скалдываться все эти счетчики будут только для чтения 
статистики (т. е. относительно редко).

-- 
  Anton Yuzhaninov



Подробная информация о списке рассылки nginx-ru