|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
мьюеткс vs IPCiv_an_ruпропущено... Да нечего там было изучать. Очень большая база с RDF и много-много юзеров, каждый из которых ковыряется read-only в одних и тех же "очень активных" данных плюс каких-то неповторяющихся "непопулярных". Под Linux, а у него есть противная особенность: просто вход и выход из мьютекса не стоят почти ничего, а вот начало ожидания на мьютексе стоит примерно столько же, сколько целая выборка строки по ключу. В случае кластера проблемы с мьютексами уменьшились настолько, что экономия перевесила даже IPC. Поскольку для такого эффекта нужно, чтобы сервер "лёг на полку", не справляясь с нагрузкой, на практике такой сценарий просто не должен встречаться. (Потом появились деньги, и вместо одного ящика поставили 8. Как раз вовремя, потому что база подросла до 2.5e10 фактов, ну и юзеров ещё больше стало.) А это только в Linux такая особенность, что ожидание занятых ресурсов через мьютекс съедает больше чем межпроцессный обмен по IPC? Или в Unix(AIX)/Solaris/Windows также?Вообще-то в каждой операционке свой график цены "сработавшего" мьютекса от общего числа "достаточно активных" нитей, между которыми планировщику надо выбирать. Скажем, винда замечательно выбирает из двух нитей, потом резкий спад скорости, то есть всё умышленно оптимизировано для популярного случая нити активно рисующей и нити активно считающей. Linux начинает чуть хуже, зато более плавно деградирует. AIX показывает самый заметный overhead на паре нитей, но зато этот overhead --- практически константа, и ящик одинаково пофигистично держит любой тип нагрузки. И да, хороший пакетный протокол IPC может обогнать ожидалки мьютексов, когда цена ожидания начинает становиться сравнимой с таймслайсом планировщика. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2011, 19:04 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
Кстати, вопрошающим не сказано, какие объекты синхронизации рассматриваются: внутриядерные или в разделяемой пользовательской памяти. Первые имеют преимущество при преобладающем ожидании, вторые - при редком ожидании. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2011, 19:53 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
RXLКстати, вопрошающим не сказано, какие объекты синхронизации рассматриваются: внутриядерные или в разделяемой пользовательской памяти. Первые имеют преимущество при преобладающем ожидании, вторые - при редком ожидании. iv_an_ru сказал, что ест "ожидание на мьютексах", что может быть при засыпании, а значит используя ядро ОС. "в разделяемой пользовательской памяти" имеется ввиду собственная реализация объекта синхронищации многопоточности через атомарные операции с переменной в разделяемой памяти? iv_an_ru , а IPC выгирывает у мьютекса в этом случае за счет группировки и пакетной обработки разделяемых ресурсов? И да, почему допустим не использовали объекты синхронизации не использующие ядро и засыпание? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2011, 20:21 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
мьюеткс vs IPC"в разделяемой пользовательской памяти" имеется ввиду собственная реализация объекта синхронищации многопоточности через атомарные операции с переменной в разделяемой памяти? Да. Только не согласен с характеристикой "собственная". Не мало таких штук используется в POSIX threads. Ожидание, как правило, выполняется не в цикле, а в yield(). iv_an_ru , а IPC выгирывает у мьютекса в этом случае за счет группировки и пакетной обработки разделяемых ресурсов? И да, почему допустим не использовали объекты синхронизации не использующие ядро и засыпание? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2011, 21:52 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
RXLКстати, вопрошающим не сказано, какие объекты синхронизации рассматриваются: внутриядерные или в разделяемой пользовательской памяти. Первые имеют преимущество при преобладающем ожидании, вторые - при редком ожидании.Разнообразные, но рабочие лошадки под виндой --- WaitForSingleObject (...INFINITE) для длинных и EnterCriticalSection для коротких, под pthreads классический спин pthread_mutex_trylock плюс pthread_mutex_lock, а с самодельными фибрами в единственном потоке, сами понимаете, вообще ничего не надо, вот только годятся они теперь разве что для карманных устройств. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2011, 01:06 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
iv_an_ruИ да, хороший пакетный протокол IPC может обогнать ожидалки мьютексов, когда цена ожидания начинает становиться сравнимой с таймслайсом планировщика. Так а за счет чего все таки IPC обгоняет ожидалки мьютексов? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2011, 23:18 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
ожидалки мьютексовiv_an_ruИ да, хороший пакетный протокол IPC может обогнать ожидалки мьютексов, когда цена ожидания начинает становиться сравнимой с таймслайсом планировщика. Так а за счет чего все таки IPC обгоняет ожидалки мьютексов?Если мьютекс начинает ждать на хотя бы каждой десятой записи, а в пакет влезает 10000 сообщений и он "стоит" максимум два сообщения, то... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2011, 23:33 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
iv_an_ruожидалки мьютексовпропущено... Так а за счет чего все таки IPC обгоняет ожидалки мьютексов?Если мьютекс начинает ждать на хотя бы каждой десятой записи, а в пакет влезает 10000 сообщений и он "стоит" максимум два сообщения, то... А почему бы для высокой конкуренции не использовать MutexSpinCount? Т.е. не становиться сразу в ожидании на мьютексе, а делать mutex.try_lock() некоторое число раз до того как заснуть. Причем с шагом равным минимальному числу таков необходимых для вашей выборки. Либо этому числу деленному на общее количество ядер, что бы в среднем поток на каждом ядре делал try() каждые N-тактов, которые необходимы для выборки. Это конечно потребует синхронизации кэшей через барьеры памяти, но мьютекс их в любом случае потребует. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2011, 03:01 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
MutexSpinCountiv_an_ruпропущено... Если мьютекс начинает ждать на хотя бы каждой десятой записи, а в пакет влезает 10000 сообщений и он "стоит" максимум два сообщения, то...А почему бы для высокой конкуренции не... делать mutex.try_lock() некоторое число раз до того как заснуть.А проблема выглядит так, как описано, уже с учётом этого трюка, без него было бы хуже. В коде используются две разные "породы" мьютексов, для "коротких в среднем" и для "длинных в среднем" ожиданий, с разной политикой по поводу try_lock. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2011, 07:48 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
iv_an_ruMutexSpinCountпропущено... А почему бы для высокой конкуренции не... делать mutex.try_lock() некоторое число раз до того как заснуть.А проблема выглядит так, как описано, уже с учётом этого трюка, без него было бы хуже. В коде используются две разные "породы" мьютексов, для "коротких в среднем" и для "длинных в среднем" ожиданий, с разной политикой по поводу try_lock. Вообще странно потому, что при таком раскладе почти никто не будет становиться в ожидание на мьютексе. Если конечно разброс ожиданий не велик. Если же разброс ожиданий велик, то SpinCount можно менять динамически. Поток захватывающий мьютекс может атомарно устанавливать(передавать) число тактов необходимое ему для разблокирования мьютекса и которое необходимо ждать другим до очередного try(). Это исключит лишнюю синхронизацию кэшей и постановку в ожидание для длинных блокировок. Плюс используя shared_mutex и учитывая, что по вашим словам большой перевес в сторону читающих транзакций, только пишущие транзакции в _редчайших_ случаях будут виновниками ожиданий на мьютексе. Неужели это все используется и не решает проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2011, 13:56 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
MutexSpinCount, На самом деле трюков там куда больше, но пусть хотя бы самые интересные из них останутся маленьким секретом ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2011, 18:09 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
iv_an_ruMutexSpinCount, На самом деле трюков там куда больше, но пусть хотя бы самые интересные из них останутся маленьким секретом ;) Ну интересней, а точнее эффективней чем LockFree контейнеры, WaitFree таблицы задач и версионность на разных уровнях ещё не придумали :) Cliff Click с LockFree Hash Table, IBM c HazardPointers и прочие ;) Просто странно, что даже со всеми интересными трюками были: iv_an_ruБолее того, у нас были "бредовые" с точки зрения любого учебника случаи, когда "кластер" из 8 нод на одном восьмиядерном ящике и 1/8 памяти для каждой ноды обгонял просто "нормальную" базу на той же машине. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2011, 00:53 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
MutexSpinCount, Ситуация, когда в скромных 128 гигов ОЗУ умещаются 13 миллиардов записей, причём с 2 полными и 3 неполными индексами --- она странная сама по себе :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2011, 05:42 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
iv_an_ruMutexSpinCount, Ситуация, когда в скромных 128 гигов ОЗУ умещаются 13 миллиардов записей, причём с 2 полными и 3 неполными индексами --- она странная сама по себе :) Получается 10 байт на запись. Это выглядит очень интересно по сравнению со средним оверхедом в 25 байт на запись в rows-oriented DBMS, к которой большинство тут популярных РСУБД относится. Но насколько я понимаю у вас column-oriented, а тут уже нужно сравнивать допустим с Exadata V2 Hybrid Columnar Compression, где column-oriented да ещё и с сжатием :) А насчет ожиданий на мьютексах, восьмушки были быстрее по общему количеству запросов в секунду или именно латентность была меньше, и эти измерения проводились при нагрузке CPU близкой к 100%? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2011, 19:23 |
|
Поговорим о масштабировании
|
|||
---|---|---|---|
#18+
MutexSpinCountА насчет ожиданий на мьютексах, восьмушки были быстрее по общему количеству запросов в секунду или именно латентность была меньше, и эти измерения проводились при нагрузке CPU близкой к 100%?По общему количеству запросов в секунду. На той версии, которая готовится сейчас к выпуску, одиночный процесс будет всё же быстрее на той конкретной нагрузке, но это было достигнуто ценой заморочек в других местах. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2011, 19:41 |
|
|
start [/forum/topic.php?fid=35&msg=37563825&tid=1552615]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
28ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 238ms |
total: | 353ms |
0 / 0 |