First Aid Kit for C/C++ server performance

Vladislav Shpilevoy

- Привет, меня зовут Влад. Я уже 10 лет работаю программистом на C и C++, занимался базами данных, разработкой игр и рекламными технологиями. Во всех этих областях мне приходилось тесно работать с сетевым кодом, и сегодня я хотел представить алгоритм, который я разработал для, как я бы назвал, довольно эффективной сетевой коммуникации, реализованный на C++. В отличие от того, что вы, вероятно, видели раньше. Лучший он или нет — вопрос спорный, всё зависит от конкретного случая использования. Но я обнаружил, что он заметно лучше того, с чем я работал до этого. Хочу подчеркнуть, что сегодня основное внимание будет уделено самому алгоритму и некоторым деталям его реализации, а не реализации в целом. Я понимаю, что большинство C++ проектов уже существуют и вряд ли перейдут на совершенно новую сетевую основу. Но я верю, что некоторые из этих проектов всё же могут выиграть, позаимствовав несколько моих идей. Надеюсь, вам понравится! - Привет, друзья, меня зовут Влад, вот уже 10 лет пишу код на C/C++, по большей части для низкоуровневой работы с сетью, системный код, и для баз данных. - В карьере мне часто приходилось измерять производительность бэкэнд кода и ускорять его. - Сегодня я покажу вам несколько частых проблем с производительностью такого кода, которые я вижу очень часто, урон они могут наносить значительный, а их устранение обычно дешевое. - Результаты я покажу на простых бенчмарках. ## Для читателей В заметках докладчика знак (>>) означает, что для перехода к следующему кадру нужно нажать «Пробел».
First Aid Kit for C/C++ server performance Vladislav Shpilevoy

C++ Russia 2024: First Aid Kit for C/C++ server performance

By Vladislav Shpilevoy

C++ Russia 2024: First Aid Kit for C/C++ server performance

I categorize the primary sources of code performance degradation into three groups: - Thread contention. For instance, too hot mutexes, overly strict order in lock-free operations, and false sharing. - Heap utilization. Loss is often caused by frequent allocation and deallocation of large objects, and by the absence of intrusive containers at hand. - Network IO. Socket reads and writes are expensive due to being system calls. Also they can block the thread for a long time, resulting in hacks like adding tens or hundreds more threads. Such measures intensify contention, as well as CPU and memory usage, while neglecting the underlying issue. I present a series of concise and straightforward low-level recipes on how to gain performance via code optimizations. While often requiring just a handful of changes, the proposals might amplify the performance N-fold. The suggestions target the mentioned bottlenecks caused by certain typical mistakes. Proposed optimizations might render architectural changes not necessary, or even allow to simplify the setup if existing servers start coping with the load effortlessly. As a side effect, the changes can make the code cleaner and reveal more bottlenecks to investigate.

  • 546