Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
Добрый день. Стоит задача организации супер низколатентного взаимодействия между параллельными потоками. Под взаимодействием подразумевается передача данных. В первом приближении архитектура такова: 1 провайдер - N получателей. По опыту изучения проблемы уже испробовал и lock-free очереди, и синхронизация по атомик переменным, по conditional переменным, мьютексы, spin-lock и т.д. Но в каждом варианте все равно фиксирую неприемлимые либо задержки в передаче данных, либо серьезное деградировании и конкуренцию ресурсов машины. Какие требования я перед собой ставлю: 1. максимальное быстрое получение данных подписчиком с момента получения даннх провайдером. счет на микросекунды (>10мкс уже провал) 2. малое потребление ресурсов машины 3. пока windows Был бы признателен если кто пожелает поделиться опытом, поскольку я в некотором тупике. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2013, 20:14 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
Эээээ... Пункт номер три ставит крест на пункте номер один. Если есть нужда в IPC рассчитанном на микросекунды, то дорога только одна: RTOS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2013, 20:37 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
aspi, 1) Попробуйте накапливать сообщения в генерирующем потоке и передавать их группами. Тогда требования к синхронизации снизятся. 2) А вы уверены что задержка именно в синхронизации? Может получатель медленно обрабатывает сообщения и поэтому следующие к нему доходят с задержкой? 3) На многопроцессорных системах часто скорость доступа к памяти гораздо выше в том процессоре, который данный блок памяти выделил. Поэтому если у вас память под все очереди выделяется в одном потоке, а работа с очередями происходит в других потоках, то возможно имеет смысл перенести выделение в рабочий поток непосредственно работающий с очередью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2013, 21:51 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
4) Если активных потоков больше чем ядер, тогда ОС вынуждена переключаться между потоками выделяя им по очереди кванты времени для выполнения на данном ядре. При этом остальные потоки, запланированные для выполнения на том же ядре, усыпляются. Насколько я помню эти кванты времени достаточно большие, чтото вроде 1 мс (но могу ошибаться). Это может быть причиной того что сообщения доставляются с задержкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2013, 22:01 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
aspi, счет на микросекунды ??? ну а тест на время, без данных и синхронизации Вас устраивает? (1мкс на 4ГГц = 4000 тактов, а это очень немного даже для RTOS) может ошибочка, и там миллисекунды, а если нет, то для каких еще задач бережете ресурсы? Можно покрутить как-то так: N получателей = X ядер - 1 (провайдер) - 1 (для системы?) Провайдер-менеджер поддерживает N (получатели между собой не конкурируют) очередей ( без realloc'a ) P.S. А без потоков, никак? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 04:32 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyaspi, 3) На многопроцессорных системах часто скорость доступа к памяти гораздо выше в том процессоре, который данный блок памяти выделил. Поэтому если у вас память под все очереди выделяется в одном потоке, а работа с очередями происходит в других потоках, то возможно имеет смысл перенести выделение в рабочий поток непосредственно работающий с очередью. Тут только надо в рассуждении потоки заменить процессорами, на которых они выполняются. Потому что NUMA относится к ядрам и физическим блокам памяти, а не к логическим потокам управления. Потоки же в SMP могут кочевать с одного ядра на другое, если не задавать affinity. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 07:45 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyaspi, 1) Попробуйте накапливать сообщения в генерирующем потоке и передавать их группами. Тогда требования к синхронизации снизятся. 2) А вы уверены что задержка именно в синхронизации? Может получатель медленно обрабатывает сообщения и поэтому следующие к нему доходят с задержкой? 3) На многопроцессорных системах часто скорость доступа к памяти гораздо выше в том процессоре, который данный блок памяти выделил. Поэтому если у вас память под все очереди выделяется в одном потоке, а работа с очередями происходит в других потоках, то возможно имеет смысл перенести выделение в рабочий поток непосредственно работающий с очередью. 4) Если активных потоков больше чем ядер, тогда ОС вынуждена переключаться между потоками выделяя им по очереди кванты времени для выполнения на данном ядре. При этом остальные потоки, запланированные для выполнения на том же ядре, усыпляются. Насколько я помню эти кванты времени достаточно большие, чтото вроде 1 мс (но могу ошибаться). Это может быть причиной того что сообщения доставляются с задержкой. Анатолий, 1. Именно так я и делаю. Провайдер получает извне данные, накапливая в буфер. Затем этот буфер нужно отдать получателям. 2. Задержка именно в синхронизации, то есть время с момента получения всех данных провайдером и временем как эти данные получил подписчик. 3. Насколько я понял, Вы предлагаете строго назначать поток-ядро 4. сейчас работающих потоков точно меньше чем ядер. Bred eFeMaspi, счет на микросекунды ??? ну а тест на время, без данных и синхронизации Вас устраивает? (1мкс на 4ГГц = 4000 тактов, а это очень немного даже для RTOS) может ошибочка, и там миллисекунды, а если нет, то для каких еще задач бережете ресурсы? Можно покрутить как-то так: N получателей = X ядер - 1 (провайдер) - 1 (для системы?) Провайдер-менеджер поддерживает N (получатели между собой не конкурируют) очередей ( без realloc'a ) P.S. А без потоков, никак? :) Тест на время в архитектуре провайдер-подписчик без данных не устраивает. Проблема в данном случае не в колве данных, а в способе взимодействия между потоками. То есть если предположить, что один пишет другой читает, например лок-фри очередь, без принужительно ожидания (например слип), то жрется проц время, то в данном случает задержек в получении данных между провайдер-подписчик нет и это устраивает. Но проблема в том, что в таком случае каждый из этих потоков делает дикое колво холостых циклов, грузит процессор и это совсем не профессионально и глупо. Тем более, колво подписчиков в будущем мне надо увеличивать и они должны все быть в равных стартовых позициях относительно получения одного и тогоже куска данных от провайдера. Без потоков никак. MasterZiv Тут только надо в рассуждении потоки заменить процессорами, на которых они выполняются. Потому что NUMA относится к ядрам и физическим блокам памяти, а не к логическим потокам управления. Потоки же в SMP могут кочевать с одного ядра на другое, если не задавать affinity. Понял. Попробую резюмировать Задачу: 1. Есть один провайдер-один подписчик. 2. Провайдер получает данные, складывает себе в буфер. Как только получил все данные (он об этом знает), буфер должен отдаться подписчику. 3. Подписчик ждет данные. как только буфер появился, он его должен прочитать и дальше обработать. Как синхронизировать потоки таким образом, чтобы минимизировать время с момента получение всех данных провайдером и получения этих данных подписчиком. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 13:21 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
aspiКак синхронизировать потоки таким образом, чтобы минимизировать время с момента получение всех данных провайдером и получения этих данных подписчиком. Для начала покажи как ты это делал с помощью Windows Events. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 13:37 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovaspiКак синхронизировать потоки таким образом, чтобы минимизировать время с момента получение всех данных провайдером и получения этих данных подписчиком. Для начала покажи как ты это делал с помощью Windows Events. например вот так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 14:55 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
aspi Код: sql 1. 2. Эту цифру пробовал увеличить до 1000? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 15:05 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovaspi Код: sql 1. 2. Эту цифру пробовал увеличить до 1000? да, пробовал. в чем скрытый смысл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 15:12 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
aspiда, пробовал. в чем скрытый смысл? Вывод на консоль довольно тормозной процесс. При малой задержке, SetEvent может вызываться до того, как в потоке закончится вывод и вызовется WaitFor. Таким образом к задержке между посылкой сигнала и его приёмом добавится время вывода на экран и ты получишь левые числа. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 15:16 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovaspiда, пробовал. в чем скрытый смысл? Вывод на консоль довольно тормозной процесс. При малой задержке, SetEvent может вызываться до того, как в потоке закончится вывод и вызовется WaitFor. Таким образом к задержке между посылкой сигнала и его приёмом добавится время вывода на экран и ты получишь левые числа. да, но, скорее всего, потерянный ивент будет если я сдедаю Sleep(1) в main. Проблема пропадание евентов, за чет того, что ктото торомзит, тоже причина того, что я не могу положиться наних ибо моя задача отработать _все_ ивенты, что сгенерировались провайдером последовательно. Провайдер же может отдавать буферы с частотой до микросекунд. Тогдая если интервал у провайдера вдруг для какойто порции увеличится, то это значит, теоретически и даже фактически, мужду провайдером и потребителем будет зависший(ие) необработанные буферы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 15:21 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
Чтобы уменьшить взаимоблокировки имеет смысл использовать мультиплексор. Т.е. один процесс выбирает данные извне или из очереди и раскладывает по N очередям. N воркеров разгребают каждый свою очередь. В этом случае работа одного форкера не мешает второму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 15:24 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
vromanovЧтобы уменьшить взаимоблокировки имеет смысл использовать мультиплексор. Т.е. один процесс выбирает данные извне или из очереди и раскладывает по N очередям. N воркеров разгребают каждый свою очередь. В этом случае работа одного форкера не мешает второму. да, и с какой частотой воркер долджен выбирать данные из очереди? мне нужно с максимальной. значит sleep(0) или безнего. но это отжер ресурсов и холостые циклы, что неприемлимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 15:27 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
aspi, Я читал топик, и на самом деле сознательно не вступал в диалог. Дело в том, что "низколатентное взаимодействие между потоками" -- это утопия. Синхронизация потоков всегда достаточно дорога. Если у тебя задача на это завязана, то что-то не так у тебя в королевстве. Скорость работы многопоточных приложений должна достигаться тем, что потоки должны получать независимые задачи и сравнительно ДОЛГО их выполнять, получать результаты и отдавать куда-то (или не получать результаты вообще). Если твои потоки всё время тычаться в синхронизацию очереди, это просто неправильно. Т.е. это правильно, но ничего быстрого от такой архитектуры ожидать нельзя. Как тут уже говорили, нужно например пачками накапливать задания и потом пачками их обрабатывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 15:50 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
MasterZivСкорость работы многопоточных приложений должна достигаться тем, что потоки должны получать независимые задачи и сравнительно ДОЛГО их выполнять, получать результаты и отдавать куда-то (или не получать результаты вообще). Осталось определиться, что считать "скоростью". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 16:30 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
всем спасибо. буду думать над архитектурой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 17:35 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
1. убрать из потоков обработки вывод на экран, вообще. Это непредсказуемые задержки ввода-вывода, если нужен вывод - делать в отдельном потоке, например через общую память(или что там в виндовс) - т е потоки обработки пишут в общую память, а поток вывода неспешно печатает. 2. наплодить потоков-потребителей, которые спят(хз как это в виндовс, но суть думаю понятна) 3. поток производитель когда подготовил данные, посылает сигнал, что данные готовы - просыпается первый попавшийся поток и начинает работать 4. время шедулирования зависит от тика системы и в виндовс он имхо достаточно большой 5. убрать sleep - это гарантированое время засыпания, которое не меньше заявленного значения(т е оно может быть больше, зависит от того, как система нагружена, сколько процессов, приоритеты и т п) 6. Приоритет у потоков потребителей должен быть выше потока производителя(иначе послав сигнал, поток производитель скорее всего опять сшедулируется к выполнению и вытеснит поток потребитель) Ну почитать, например, вот это http://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCoQFjAA&url=http://www3.msiu.ru/~vag4/rms.doc&ei=JO-UUY3DJKyQ4ASIh4HYBA&usg=AFQjCNFNa84iDywPe2lqiEFeh2CPqejj7g&sig2=FPim8d3ZdxDIJ6PR5_uCHQ&bvm=bv.46471029,d.bGE&cad=rjt ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 18:39 |
|
||
|
Ultra LowLatency threads interaction (низколатентное взаимодействие между потоками)
|
|||
|---|---|---|---|
|
#18+
aspi, думаю Вам необходимо определиться с масштабом времени, так как тут ms Код: plaintext 1. 2. 3. 4. а дальше опять Провайдер же может отдавать буферы с частотой до микросекунд . к тому же, приход порции данных провайдеру не повод взводить Event. Подписчик должен выбирать очередь пока она не пуста, а не за один Event один буфер. Провайдер сигнализирует только при наполнении пустой очереди. Можно закладываться на крейсерский отклик потока на Event'e < 1 ms. Но нужно и знать, что делать, если какой-то отклик будет через 20-50мс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2013, 20:32 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38260452&tid=2020216]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
166ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 280ms |
| total: | 552ms |

| 0 / 0 |
