Иван Авсеянко @Rebus
Программист
Information
- Rating
- Does not participate
- Location
- Москва, Москва и Московская обл., Россия
- Date of birth
- Registered
- Activity
Specialization
Backend Developer, Fullstack Developer
JavaScript
HTML
CSS
Web development
Perl
MySQL
PostgreSQL
Redis
Nginx
High-loaded systems
Техническая состоит в том, что база покамест не настолько качественна, чтобы ей можно было гордиться (по моему мнению). К сожалению, у нас намного меньше ресурсов и финансовых возможностей, чем у Яндекса, и, тем более, у Гугла. Насколько мне известно, на текущий момент, на каждого нашего разработчика приходится 5-6 человек в Яндексе. И мы не можем позволить себе просто купить компанию — владельца прав на спутниковые карты, как это сделали Яндекс и Гугл. Но Рамблер старается улучшать и развивать свои сервисы, в том числе и данные по географии, насколько это в наших силах.
Организационная проблема — в том, чтобы убедить руководство в том, что это вообще нужно, и подготовить данные для выкладки в публичном формате. В относительно большой организации, получить все необходимые разрешения довольно непросто. Я попробую завтра поговорить с руководством на эту тему, если эти данные действительно кому-то интересны, но, боюсь, выкладка в публичный доступ маловероятна в ближайшее время.
Не согласен. Это возможно, только в том случае, если у вас очень мощные проц и память, и относительно слабый канал. В таких условиях, возможно, многопоточный (например) сервер сможет чуть более эффективно использовать всю ширину канала. Но в противоположном случае — слабый проц, мало памяти, широкий канал — более эффективен будет именно асинхронный сервер.
Это так, хотя бы потому, что переключение между единицами планирования в операционной системе не может знать всех подробностей о каждом из потоков, которые будут выполняться. Она может опираться только на статистику, если этот поток уже выполнялся ранее. А вот state-машина прекрасно осведомлена о состоянии каждого из обслуживаемых подключений, и может, основываясь на этой информации, более оптимально выбирать следующее обслуживаемое подключение. Собственно говоря, по той же причине, user-space треды менее надёжны, но зато в разы более эффективны, чем треды, которые обслуживаются ОС. Вам не надо переключать тяжёлые контексты вне основной единицы планирования, сбрасывать кеш процессора, и прочая, и прочая.
> «количество переключений между контекстами выполнения минимизируется» и «практически нет необходимости в синхронизации процессов или потоков» — неверны. И, если у вас достаточно нагруженные сайты, то вы можете заметить, как nginx грузит процессор
Речь шла про сравнение с поточными и процессными моделями. В случае с nginx нагрузка будет меньше, чем если бы сервер обслуживал запросы в несколько потоков. Разумеется, nginx грузит процессор, и разумеется, в нём есть довольно большой простор для оптимизации, но это отдельная, довольно долгая песня. :)
> Если быть более точным, то они верны только в том случае, когда nginx работает одним процессом, а когда дело доходит до SMP, то в нем используется и локинг и есть переключения контекста, которых Игорь, в принципе, может избежать, но пока он почему-то этим не занимался.
Ну, вероятно, потому, что у него есть основная работа, и её немало. :) А совсем без переключений контекста, даже в случае SMP-системы не обойтись. Мы ведь живём не в идеальном мире… :)
> Например, можно сделать так, чтобы сервер использовал не единственную системную очередь (kqueue), а отдельную для каждого процесса/потока (и соответственно cpu). При этом пусть слушающий сокет и будет только в одной из них, зато можно новые установленные соединения распределять между потоками не добавляя запросов на нотификацию событий о них в одну общую очередь, а наоборот — раскидывая их по собственным kqueue каждого потока.
Мне эта идея кажется неплохой, но её реализация, вероятно, потребует немало времени, поскольку придётся переписывать всё, включая API модулей. Да и, если подумать, блокировки пока не являются «бутылочным горлышком», поскольку всё-равно, большая часть времени сервера уходит на ожидание сетевого ввода-вывода,