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