All streams
Search
Write a publication
Pull to refresh
-6
0
habr is dead. @yleo

/dev/null

Send message

Ящик водки и всех обратно!
Как-то навеяло.

Приходит "Хабр" к доктору:


  • Доктор, я феномен.
  • В чем же Ваш феномен, батенька?
  • У меня яйца звенят.
  • Да Вы, батенька, не феномен, Вы — мудозвон!

;)

На всякий: __volatile + __asm("":::"memory") даёт именно std::memory_order_acq_rel.


Т.е. в плюсах для аналогичного эффекта нужно std::atomic_signal_fence(std::memory_order_acq_rel), а не что-то другое.

Совсем пустой бесконечный цикл не нужен, поэтому и причислен к UB. Но цикл с чем-нибудь вроде __asm __volatite(...) уже не является совсем пустым и не вызывает UB.


С небольшими оговорками можно сказать что инструкции NOP/PAUSE/HLT или их аналоги есть на всех архитектурах CPU:


  • с точки зрения кодирования команд CPU эти инструкции могут быть синонимами других реальных инструкций. Например, на x86: NOP = XCHG AX, AX; PAUSE = REP XCHG AX, AX
  • исполнительное ядро CPU (в том числе в зависимости от модели/ревизии) может либо обрабатывать их в точности в соответствии с кодированием (Intel 8086 вместо NOP реально выполнял XCHG AX, AX), либо в соответствии с дополнительной семантикой (Intel 486 начал именно выполнять PAUSE уступая шину, а не REP NOP).
  • в худшем случае вместо NOP/PAUSE/HLT могут использоваться (замещаться при ассемблировании) заведомо безобидные и всегда доступные инструкции. Например, условный или безусловный переход к следующей команде.

Честно говоря я уже запутался в том, кто и что здесь пытался сформулировать и обсудить. В реальность уже лет 20-30 примерно так:


  1. __asm __volatile("bla-bla-bla") — чтобы компилятор не выбросил конструкцию и не задумывался о UB в бесконечных циклах.
  2. __asm __volatile("bla-bla-bla" ::: "memory") — тоже самое, плюс уведомление компилятора об изменении любых переменных в памяти.
  3. __asm __volatile("HLT" ::: "memory") — в idle-задаче или планировщике.
  4. __asm __volatile("PAUSE" ::: "memory") — в циклах ожидания на блокировках.
  5. __asm __volatile("NOP") — для заполнения при выравнивании и в циклах задержки.

Чуть менее чем во всех мультизадачных ОС используется именно такой паттерн: idle-задача с минимальным приоритетом в виде бесконечного цикла с HLT-подобной инструкцией (остановка CPU до прерывания).


В чуть более продвинутых системах этот паттерн немного оптимизируется для исключения лишних переключений контекста — грубо говоря, HLT переноситься в планировщик и терминирует цикл при отсутствии активных задач.

TL;DR — ClickHouse будет "как тузик грелку" PostgreSQL во всех своих целевых сценариях использования, ибо именно для этого CH был сделан. Т.е. чем ближе совокупность "данные + запросы" к назначению CH, тем ближе буду результаты сравнительных бенчмарков с PG к "как тузик грелку" (в два и более раз).


Такое моё утверждение может показаться слишком сильным и категоричным, но чем больше кто-либо будет погружаться во внутреннее устройство PG и CH, тем больше будет соглашаться. Причем это нисколько не принижает достоинства PG, просто не каждым микроскопом удобно забивать шурупы ;)


Если совсем грубо и коротко, то в своих целевых сценариях CH почти не делает лишнего и очень эффективно использует железо (SIMD, последовательное чтение, сжатие и т.п.). В таких сценариях Постгресу (мягко говоря) крайне сложно тягаться с CH, оставаясь при этом именно Постресом (сохраняя ACID поверх MVCC путем COW/ShadowPaging). Со стороны CH при этом отсутствуют транзакции и удаление/изменение данных в привычном для PG понимании. Т.е. CH тут быстрее, в частности, потому что много не позволяет.


Какого-либо пренебрежения к "возможностям PG" я не вижу. Точнее говоря, в моем понимании, посыл автора не в "принижении PG", а в демонстрации возможностей FDW. Другими словами, главным я вижу не "насколько PG медленнее CH" (в целевых для CH сценариях это неизбежно), а то что Clickhousedb_fdw позволяет через готовый PG-интерфейс (ODBC и т.д.) в дополнение к PG получить также и часть мощности CH. Причем во многих случаях с относительно небольшой наценкой.




Проседание Q14 показывает текущее положение дел в Clickhousedb_fdw, т.е. не готовность к production. Грубо говоря, Clickhousedb_fdw (пока) умеет "перебрасывать" на сторону CH только относительно простые join-ы (complex join pushdown NOT supported).


Поэтому, чуть более сложный join будет выполняться на стороне PG. Другими словами, если Clickhousedb_fdw не полностью справляется с трансляцией запроса, то сначала будут выполнены подзапросы на стороне CH, затем эти данные будут загружены внутрь PG и уже после будут join-ится. Проседание Q14 как раз хорошо показывает последствия.


Реализация complex join pushdown сводиться к волокитной трансляции из PG-диалекта SQL в CH-SQL. Это местами очень занудная, а местами нетривиальная задача. Причем если делать по-хорошему, то следует обеспечить разумно-оптимальную трансляцию "экс-территориальных" join-ов, когда в одном запросе используются как таблицы из CH, так и из PG, а желательно и из другого FDW. Короче, пока ребята из Percona это отложили, и (мне) понятно почему.

WSL2 даст нормальную поддержку всех системных вызовов Linux и ≈10-кратное ускорение операций с файлами, но только если их размещать "внутри Linux" (на EXT4, а не в Windows). Однако, доступ к "виндовым" файлам из WSL2 замедлится ≈вдвое.


Короче, для вас (видимо) что-либо поменяется принципиально только если убрать Windows-прокладку.

Всё так, но (вероятно) не все читали (или поняли) анонс.
Видимо поэтому продолжаются какие-то сборы и сравнения мягкого с мелким ;)

Сейчас-то да, но когда в Apple принимали решение о женитьбе на clang ситуация была совсем иная.

По моему скромному мнению, развитие GCC в основном тормозит не лицензия, а более мутное внутреннее устройство (по историческим причинам) и, как следствие, высокий порог входа. Как пример, GPL как-то не особо мешает развитию Linux.


Тем не менее, лицензия Apache 2.0 действительно позволяет коммерческим компаниям гораздо лучше (понятнее и с меньшими рисками) защищать свои инвестиции при разработке собственных продуктов на основе clang. Фактически в upstream clang-а сейчас большинство инфраструктурных изменений попадает именно так — для выстраивания базиса закрытых разработок.

Форкнуть-то можно, но затем:


  • выпиливать из форка всё лишнее, либо самим раскатывать изменения.
  • фиксировать интерфейс базовых/общих компонентов и иметь проблемы со своими доработками, либо иметь проблемы с импортом доработок и исправлений из upstream.
  • и т.п.

Короче, форк не требует убеждать community, в обмен на выполнение соответствующей работы своими руками (объём которой будет постоянно расти).

С "секретным железом" нет никаких проблем, пока вы не передаёте кому-либо условный GCC с вашими "правками для секретного железа". Но и в этом случае, в соответствии с GPL, вы обязаны показать исходники только тем, кому дали готовый компилятор и только по их требованию (которого может НЕ быть по массе причин).


Более того, передаваемые исходники должны обеспечивать возможность сборки компилятора, но вовсе НЕ обязаны содержать какую-либо документацию по "секретному железу" или как-либо его раскрывать.


В реальности же, всё это крайне трудно формализировать до уровня служебных инструкций и соглашений по коммерческой тайне внутри компании. Практически невозможно контролировать и наказать сотрудника за слив информации (доказать что он умышленно раскрыл коммерческую тайну).


Тем не менее, у Apple не было тогда и нет сейчас "секретного железа", которое бы требовал правок компилятора. Тогда планировались, а теперь есть софтверные механизмы защиты завязанные на фичи компилятора, но не "железо". Причем (насколько мне известно) всё необходимое давно есть и в GCC ;)

Ну да, andreybokhanko несколько упросил и смешал разные обстоятельства и причины, приправив "секретным железом".


В случае Apple было примерно так:


  • Хотелось Objective-C компилятор cо специфическими фичами для Darwin.
  • Хотелось C компилятор с дополнительными фичами для Objective-C и Darwin.
  • При использовании GCC требовалось:
    1. Расплачиваться трудоемкостью за толщину культурного слоя и техдолг внутри GCC.
    2. Убеждать community принимать эти правки, в том числе вносить изменения в общие/базовые компоненты и "раскатывать" эти изменения по другим (ненужным для Apple) архитектурам CPU.
    3. "Засвечивать" все свои идеи и открывать реализацию под GPL.

Поэтому логично что "манагеры эпла" решили попробовать, когда появился подходящий PhD с работающим (пусть и академическим) проектом. А потом поперло...

Да, но причина немного в другом — эти операции выполняются тормозной NTFS (со всеми проблемами WSL1), но добавляются накладные расходы маршалинга через виртуальную сеть. А с NTFS в Linux всё более-менее.

Нет, немного иначе:


  • WSL1 = тормозят все системные вызовы, но больше всего связанные с файловыми операциями (ибо эмуляция средствами тормозной NTFS).
  • WSL2 = сильно тормозит доступ к файлам расположенным внутри винды (ибо доступ через виртуальную сеть с эмуляцией средствами тормозной NTFS), но остальное работает почти как в Linux.



Если учесть что в WSL1 принципиально не могут работать некоторые вещи, то самое рациональное решение — использовать WSL2 с размещением файлов в EXT4, а не в NTFS.

Капитан очевидность лет 10 бубнит что переходить стоит, но сразу на Linux ;)

Теперь точно получит (

И тогда CPU будет кушать примерно вдвое больше энергии.


Лучше __asm __volatite("").


P.S.
Интересна логика (и познания) "первого минуса" ;)

Information

Rating
Does not participate
Location
Севастополь, Республика Крым, Россия
Date of birth
Registered
Activity