Записки о низком уровне
Записки про то, что ниже прикладного кода: аллокаторы, системные вызовы, профилирование, странные падения, конкурентность и особенности ABI. Пишу о том, что сам измерял, и честно отмечаю, где сначала измерил неправильно - таких мест больше, чем хотелось бы.
-
7 минконкурентность1 комм.
Фьютекс в профиле: p99 держал глобальный мьютекс
Сервис раз в сотню запросов отвечал на три миллисекунды дольше обычного. Я неделю подозревал аллокатор, а виноват был один общий мьютекс и очередь на нём.
-
7 миналлокаторы2 комм.
Арена вместо malloc: девять раз и цена в RSS
Заменил поштучные malloc на bump-аллокатор и получил 1,42 с → 0,158 с. А потом алерт по памяти показал, что я заплатил за это полутора гигабайтами RSS.
-
6 минкэшбез комментариев
Промахи TLB: шесть гигабайт случайного доступа
Хеш-таблица на шесть гигабайт тормозила на ровном месте. Я был уверен, что это кэш последнего уровня, а счётчики показали обход страниц.
-
6 минконкурентность1 комм.
Ложное разделение: счётчики в одной кеш-линии
Добавил потоков - стало медленнее. Восемь счётчиков лежали в одной 64-байтной линии, и ядра дрались за неё по шине.
-
6 минсисколлы1 комм.
Девяносто два процента сисколлов - мои же
Демон жёг 140 % CPU без полезной работы. Я начал с strace, прочитал его вывод неправильно и три часа подозревал epoll.
-
7 минпрофилирование2 комм.
Профиль показал memcpy, а дело было в кеше
Три дня оптимизировал копирование, которое стояло на вершине профиля, и получил минус один процент. Счётчики кеша объяснили, почему.
-
8 минпадения1 комм.
SIGBUS раз в три дня: packed и атомарный доступ
Падало на двух узлах из девяти, раз в двое-четверо суток, и только на aarch64. Санитайзер нашёл причину за сорок миллисекунд.
-
6 минabiбез комментариев
Восьмой аргумент: прототип короче определения
Функция возвращала правильный результат ровно до тех пор, пока на стеке под ней лежал нуль. Разбор по SysV AMD64 и дизассемблеру.
-
6 минпамять1 комм.
RSS после free: фрагментация, а не утечка
Два гигабайта остались в резидентной памяти после освобождения всего. Valgrind говорил «ноль потерь», и прав был он.
Про что здесь не бывает
Ни обзоров языков, ни «десяти приёмов», ни бенчмарков без данных. Каждая запись - это один разбор: что болело, чем мерил, какая цифра получилась, где я ошибся в методе. Если разбор заканчивается словами «стало быстрее», но без числа, он не дописан и в список не попадает.
Листать можно по темам и годам или искать по тексту; есть и Atom-лента. Железо для замеров и порядок «счётчики, потом профиль» - на странице инструментов, про себя - коротко здесь.