Forwarded from Experimental chill
Futex (Fast Userspace Mutex) это примитив синхронизации в ядре Linux, который позволяет ждать регион памяти по какому-то значению с каким-то таймаутом. Из-за своего названия может показаться, что futex это на самом деле mutex, но это не так. Это было так в гораздо более ранней реализации, но теперь (Linux 2.6+) это просто примитив очереди ожидания (waitqueue), доступный для пользовательского пространства. Опция FUTEX_WAKE говорит: «Разбуди всех, кто ждет по этому адресу». FUTEX_WAIT говорит: «Когда я читаю ADDR, он содержит VALUE: если он все еще содержит это значение, когда вы смотрите на него, спите, пока кто-то не вызовет FUTEX_WAKE по этому адресу». А FUTEX_FD посылает все нотификации в файловый дескриптор.
Mutex из Futex можно сделать так: Два потока совместно используют некоторую память и соглашаются использовать её часть в качестве синхронизации (или блокировки). 1 означает разблокирован, 0 означает заблокирован, <0 означает заблокирован и кто-то ждет. Чтобы захватить блокировку, вы выполняете операцию atomic декремента: если он достигает 0, значит, это было 1, и у вас есть блокировка. В противном случае вы немного подождёте. Когда вы хотите снять блокировку, вы снова устанавливаете ее на 1. Это действительно быстро, если нет конфликта за блокировку и futex достаточно хорошо работает при маленьком количестве потоков борящихся за блокировку. Также ядро достаточно хитрым образом не уходит в своё пространство, когда нет contention на регион, но об этом в другом посте.
Futex используется в каждой реализации лока, в том числе glibc, abseil. Это действительно удобный интерфейс для имплементации медленных путей в локах, семафорах. Futex хоть и поменял то, как мы мыслим о локах в 2000х годах, к сожалению всё ещё существует достаточно много проблем. Некоторые из них такие:
0. Код вокруг Futex нереально сложный
1. Futex ещё всё умеет только ждать по 32 битному региону памяти, иногда это может вызывать проблемы в долгоживущих программах и некоторых имплементациях локов. Также может не подходить для embedded систем, где 32 битного адреса нет совсем
2. Futex не умеет давать подсказки по тому на какой NUMA стоит иметь регион
3. Futex не умеет ждать по многим регионам памяти одновременно
Последний недостаток как ни странно достаточно сильно бьёт по игровым движкам, например, в Windows есть WaitForMultipleObjects. Тот же wine и proton писали, что на Linux создаются большие проблемы из-за этого и им приходится из-за этого придумывать трюки с eventfd , чтобы демонстрировать то же поведение, из-за чего происходит большая нагрузка на файловые дескрипторы, которых ограниченное количество на Linux (движки репортят миллионы). В итоге получается, что некоторые игры просто не могут пойти на Linux из-за проблем синхронизации или работают медленно.
Valve, Collabora (продукты LibreOffice и тд) объединили свои силы в пропозал почти 2 года назад улучшить futex добавив futex2, где большинство упомянутых проблем решаются. У них получилось с помощью множества wait (futex_waitv) ускорить Beat Saber и Tomb Raider на 4%.
К сожалению, после года обсуждений оф. RFC оно не попало в Linux 5.15, но имеет все шансы попасть в Linux 5.16, почти ни у кого нет уже вопросов, и кажется консенсус обретён.
Я надеюсь, что выбор Arch Linux у Steam Deck от Valve был под влиянием некоторых таких изменений, Arch Linux обновляет своё ядро очень быстро и можно спокойно продолжать гнуть свою палку по переводу игр на Linux, получая сразу все фичи, что несомненно меня радует как и глубокие изменения, которые Valve делают в ядре, чтобы это произошло. Кто, если не Valve 🙂
[1] Futexes Are Tricky (советую прочитать, чтобы понять как пользоваться futex)
[2] Изначальный пропозал от Collabora и Valve
[3] Rethinking the futex API
[4] futex man page
[5] A New Futex2() System Call - André Almeida, Collabora (видео от основного контрибьютера)
[6] Linux 5.15 attempt, 5.16 attempt
[7] WIN32 WaitForMultipleObjects API
[8] Valve’s upcoming Steam Deck will be based on Arch Linux—not Debian
[9] Официальный RFC в ядро
[10] Glibc lock implementation
[11] C++20 atomic_wait/notify
Mutex из Futex можно сделать так: Два потока совместно используют некоторую память и соглашаются использовать её часть в качестве синхронизации (или блокировки). 1 означает разблокирован, 0 означает заблокирован, <0 означает заблокирован и кто-то ждет. Чтобы захватить блокировку, вы выполняете операцию atomic декремента: если он достигает 0, значит, это было 1, и у вас есть блокировка. В противном случае вы немного подождёте. Когда вы хотите снять блокировку, вы снова устанавливаете ее на 1. Это действительно быстро, если нет конфликта за блокировку и futex достаточно хорошо работает при маленьком количестве потоков борящихся за блокировку. Также ядро достаточно хитрым образом не уходит в своё пространство, когда нет contention на регион, но об этом в другом посте.
Futex используется в каждой реализации лока, в том числе glibc, abseil. Это действительно удобный интерфейс для имплементации медленных путей в локах, семафорах. Futex хоть и поменял то, как мы мыслим о локах в 2000х годах, к сожалению всё ещё существует достаточно много проблем. Некоторые из них такие:
0. Код вокруг Futex нереально сложный
1. Futex ещё всё умеет только ждать по 32 битному региону памяти, иногда это может вызывать проблемы в долгоживущих программах и некоторых имплементациях локов. Также может не подходить для embedded систем, где 32 битного адреса нет совсем
2. Futex не умеет давать подсказки по тому на какой NUMA стоит иметь регион
3. Futex не умеет ждать по многим регионам памяти одновременно
Последний недостаток как ни странно достаточно сильно бьёт по игровым движкам, например, в Windows есть WaitForMultipleObjects. Тот же wine и proton писали, что на Linux создаются большие проблемы из-за этого и им приходится из-за этого придумывать трюки с eventfd , чтобы демонстрировать то же поведение, из-за чего происходит большая нагрузка на файловые дескрипторы, которых ограниченное количество на Linux (движки репортят миллионы). В итоге получается, что некоторые игры просто не могут пойти на Linux из-за проблем синхронизации или работают медленно.
Valve, Collabora (продукты LibreOffice и тд) объединили свои силы в пропозал почти 2 года назад улучшить futex добавив futex2, где большинство упомянутых проблем решаются. У них получилось с помощью множества wait (futex_waitv) ускорить Beat Saber и Tomb Raider на 4%.
К сожалению, после года обсуждений оф. RFC оно не попало в Linux 5.15, но имеет все шансы попасть в Linux 5.16, почти ни у кого нет уже вопросов, и кажется консенсус обретён.
Я надеюсь, что выбор Arch Linux у Steam Deck от Valve был под влиянием некоторых таких изменений, Arch Linux обновляет своё ядро очень быстро и можно спокойно продолжать гнуть свою палку по переводу игр на Linux, получая сразу все фичи, что несомненно меня радует как и глубокие изменения, которые Valve делают в ядре, чтобы это произошло. Кто, если не Valve 🙂
[1] Futexes Are Tricky (советую прочитать, чтобы понять как пользоваться futex)
[2] Изначальный пропозал от Collabora и Valve
[3] Rethinking the futex API
[4] futex man page
[5] A New Futex2() System Call - André Almeida, Collabora (видео от основного контрибьютера)
[6] Linux 5.15 attempt, 5.16 attempt
[7] WIN32 WaitForMultipleObjects API
[8] Valve’s upcoming Steam Deck will be based on Arch Linux—not Debian
[9] Официальный RFC в ядро
[10] Glibc lock implementation
[11] C++20 atomic_wait/notify
Forwarded from Полезняшки от "Разбора Полетов"
How Docker broke in half
https://www.infoworld.com/article/3632142/how-docker-broke-in-half.html
https://www.infoworld.com/article/3632142/how-docker-broke-in-half.html
InfoWorld
How Docker broke in half
The game changing container company is a shell of its former self. What happened to one of the hottest enterprise technology businesses of the cloud era?
Forwarded from Грефневая Кафка (pro.kafka)
Я просто хочу тут быстренько напомнить, что #KafkaSummit уже на следующей неделе.
Да, виртуально. Да, требуется регистрация.
Но должно быть интересно!
https://www.kafka-summit.org/events/kafka-summit-americas-2021/about
Да, виртуально. Да, требуется регистрация.
Но должно быть интересно!
https://www.kafka-summit.org/events/kafka-summit-americas-2021/about
Forwarded from ☕️ Мерлин заваривает τσάι 🐌
Язык программирования, который контролирует мировые финансы: 240 миллиардов строк кода на COBOL
https://habr.com/ru/company/itelma/blog/577736/
https://habr.com/ru/company/itelma/blog/577736/
Хабр
Язык программирования, который контролирует мировые финансы: 240 миллиардов строк кода на COBOL
«Второй по ценности актив в США — после нефти — это 240 миллиардов строк кода на COBOL» Когда Томас впервые начал программировать, это был 1969 год. Он был ребенком, только что окончившим среднюю...
немного стаистики по часовым поясам и переводу времени https://blog.scottlogic.com/2021/09/14/120-years-timezone.html
Scott Logic
Exploring 120 years of timezones
Timezones, and daylight saving - the practice of moving clocks forward by one hour once a year - are a pain. They make it hard to schedule international meetings, plan travel, or may simply cause you to be an hour late for work once a year. For a developer…
Forwarded from Полезняшки от "Разбора Полетов"
B-Trees: More Than I Thought I'd Want to Know
https://benjamincongdon.me/blog/2021/08/17/B-Trees-More-Than-I-Thought-Id-Want-to-Know/
https://benjamincongdon.me/blog/2021/08/17/B-Trees-More-Than-I-Thought-Id-Want-to-Know/
benjamincongdon.me
B-Trees: More Than I Thought I'd Want to Know
B-Trees are not boring, after all
вот такой интересный криэйт по хранению String на стэке: https://github.com/ParkMyCar/compact_str
GitHub
GitHub - ParkMyCar/compact_str: A memory efficient string type that can store up to 24* bytes on the stack
A memory efficient string type that can store up to 24* bytes on the stack - ParkMyCar/compact_str
Forwarded from addmeto (Grigory Bakunov)
Мелкая но интересная новость: у Clickhouse теперь есть своя компания, которая будет оказывать поддержку и продавать облачные решения на базе. Лёша Миловидов и разработчики пока продолжают работать в Яндексе, новой компанией занимаются пришельцы из других корпораций. Но надо всех поздравить, значимая история для русского опенсорса.
UPD: Лёша и команда уже переместились в новую компанию, вот теперь поздравляю всех причастных! https://www.businessinsider.com/clickhouse-creators-raise-50-million-for-new-company-2021-9
UPD: Лёша и команда уже переместились в новую компанию, вот теперь поздравляю всех причастных! https://www.businessinsider.com/clickhouse-creators-raise-50-million-for-new-company-2021-9
Business Insider
The creators of the popular ClickHouse project just raised $50 million from Index and Benchmark to form a company that will take…
ClickHouse was created 10 years ago and is already used by firms like Uber, eBay, and CloudFlare. Now, it's building a business around the product.