LINUX.ORG.RU

Разработчик PyParallel считает, что оффтопик удобнее для реализации параллелизации

 , pyparallel,


2

7

Для !Ъ: раз срач, два срач

Контекст: PyParallel — форк py3 с сохранением GIL и прочего, умеющий в многоядерность и линейно (!) скалящийся при этом. Проект в альфе с прицелом на то, чтобы влиться в py4. На данный момент оно состоит из платформо-пофигистических изменений в cpython и жёстко привязанной к оффтопику платформозависимой части (но если оно будет вливаться в cpython, то кроссплатформенным оно рано или поздно будет). Производительность выглядит неплохой для альфы.

Trent Nelson, разработчик всего этого а заодно core python commiter, высказывается:

(цитата для Ъ)

You could port PyParallel to Linux or OS X — there are two parts to the work I’ve done: a) the changes to the CPython interpreter to facilitate simultaneous multithreading (platform agnostic), and b) the pairing of those changes with Windows kernel primitives that provide completion-oriented thread-agnostic high performance I/O. That part is obviously very tied to Windows currently.

So if you were to port it to POSIX, you’d need to implement all the scaffolding Windows gives you at the kernel level in user space. <...> you’d have to manage your threadpools yourself, and each thread would have to have its own epoll/kqueue event loop. The problem with adding a file descriptor to a per-thread event loop’s epoll/kqueue set is that it’s just not optimal if you want to continually ensure you’re saturating your hardware (either CPU cores or I/O). <...>

As soon as you issue a blocking file I/O call on one of those threads, you have one thread less doing useful work, which means you’re increasing the time before any other file descriptors associated with that thread’s multiplex set can be served, which adversely affects latency. And if you’re using the threads == ncpu pattern, you’re going to have idle CPU cycles because, say, only 6 out of your 8 threads are in a runnable state. <...> The best example of how that manifests as an issue in real life is make –jN world — where N is some magic number derived from experimentation, usually around ncpu*2. Too low, you’ll have idle CPUs at some point, too high and the CPU is spending time doing work that isn’t directly useful. There’s no way to say make –j<just-do-whatever-you-need-to-do-to-either-saturate-my-I/O-channels-or-CPU-cores-or-both>

<...>with Windows, it’s a completely different situation. The whole kernel is architected around the notion of I/O completion and waitable events, not “file descriptor readiness”. This seems subtle but it pervades every single aspect of the system. The cache manager is tightly linked to the memory management and I/O manager – once you factor in asynchronous I/O this becomes incredibly important because of the way you need to handle memory locking for the duration of the I/O request and the conditions for synchronously serving data from the cache manager versus reading it from disk. The waitable events aspect is important too – there’s not really an analog on UNIX. Then there’s the notion of APCs instead of signals which again, are fundamentally different paradigms. The digger you deep the more you appreciate the complexity of what Windows is doing under the hood.

Дискасс.

TL;DR: ему лень писать уйму низкоуровневого клея для линуксов когда в винде внезапно оказались подходящие примитивы, с которыми всё просто работает.

Перемещено true_admin из talks

★★★★★

Последнее исправление: x3al (всего исправлений: 2)

ОН переносится?

Siado ★★★★★
()

ему лень писать уйму низкоуровневого клея для линуксов

Только вот хоть кому-то на винде нужна эта штука? На линуксе это хоть можно применить. Но на винде-то?

Stahl ★★☆
()

Офигеть вы добрые. Чувак пишет вундервафлю. Он говорит, что ЕМУ так удобнее. И его все такие раз и гавном измазали. Ну может ктонибудь кто считает, что Linux важен поможет ему?

dmxrand
()

питонисты не осилили?

umren ★★★★★
()
Ответ на: комментарий от invy

Оно построено на юзе низкоуровневых vista+ апи, последние билды требуют win8+. Winelib такое не осилит, да и смысла особого нет, тут скорее какой-нибудь libevent2.

Другое дело, что libevent2, как и положено портированной с *NIX низкоуровневой вещи, ужасно тормозит на оффтопике.

x3al ★★★★★
() автор топика
Ответ на: комментарий от ximeric

График говорит, что:

  • Разработанные в *NIX фишки не портируются на винду с приемлемой производительностью
  • Его вундервафля обгоняет их. Более того, она быстрее всего, включая golang.

Суть — в том, что в винде нет epoll. Вместо этого своё async-апи (IOCP). И автор считает, что оно гораздо круче epoll и именно поэтому портировать epoll-заточенный софт на винду нет смысла.

https://speakerdeck.com/trent/pyparallel-how-we-removed-the-gil-and-exploited... рассказывает это в тонне букв и тонне слайдов, аргументированно объясняя, почему в *NIX ничерта нет настоящего асинхронного IO и вообще асинхронных примитивов и называя танцы вокруг epoll/kqueue «имитацией асинхронности через неблокирующие синхронные вызовы».

x3al ★★★★★
() автор топика
Ответ на: комментарий от x3al

называя танцы вокруг epoll/kqueue «имитацией асинхронности через неблокирующие синхронные вызовы»

всё правильно говорит

frame ★★★
()

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

Что за «completion-oriented protocol»??

И что значит «syncronus non-blocking IO»? Для меня это не имеет смысла. Если только он не имел в виду что у него всего один event loop.

true_admin ★★★★★
()

PyParallel — форк py3 с сохранением GIL и прочего, умеющий в многоядерность и линейно (!) скалящийся при этом

Где-то здесь разводка.

tailgunner ★★★★★
()

Дочитав до середины презентации и посмотрев википедию, я немного начал его понимать. Он там рассказывает о windows iocp.

Я так понял это poll/epoll с буферизацией сокетов и уведомлением о событиях в очередь сообщений. По одной такой штуке запускается на каждое ядро.

Плюсы:

1) Буферизация и уведомления в очередь делаются на уровне ядра, а не в отдельном треде. Это позволяет уменьшить кол-во тредов.

2) Каждое ядро CPU держит один и только один такой обработчик чтобы не терять в скорости на переключении тредов.

Что скажешь, tailgunner?

PS а в линуксе ведь вообще вундерфафлю хотели запилить когда можно было одним системным вызовом работать сразу с несколькими дескрипторами. Видимо, сдохло :)

PPS презентацию ещё не досмотрел.

true_admin ★★★★★
()

Читаю https://github.com/pyparallel/pyparallel/wiki/The-PyParallel-Experiment и всё сильнее подозреваю, что нас разводят. Похоже на старую идею о запуске нескольких интерпретаторов в одном процессе.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Я так понял что основная идея в том stateless-код можно выполнять гораздо проще и без GIL. Вместо выделения памяти на общей куче и блокируемые malloc/free можно выделить целый регион который при завершении вычислений будет одним махом убит. Поэтому free() становится не нужен. При этом они ещё и не считают reference counting и не делают GC.

Из минусов это то что не всякий код stateless и, т.к. нет GC, память высвобождается только в самом конце.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Не-а. Оно снапшотит кучу именно потому, что убивать одним махом не всегда работает, чуть дальше в презентации про это сказано.

x3al ★★★★★
() автор топика

ему лень писать уйму низкоуровневого клея для линуксов когда в винде внезапно оказались подходящие примитивы, с которыми всё просто работает.

Нет. Просто асинхронное ПО с/на венду не портируется. Кардинально разные концепции.

Хаскелисты, вон, знают. Так и сидят без нативного I/O под вендой.

Macil ★★★★★
()
Ответ на: комментарий от dmxrand

Эта вундервафля не дает никаких преимуществ, следовательно ненужна
Всем пофиг, просто угарают с чувака

mystery ★★
()
Ответ на: комментарий от mystery

Эта вундервафля на равном железе по requests/second обгоняет вообще всё, включая LWAN под линуксом. При том, что это python под виндой против C на линуксах. Конечно, оно сильно затюнено под этот бенчмарк с применением достаточно чёрной магии, но всё же.

И код на бенчмарке — вполне себе питон.

x3al ★★★★★
() автор топика

Мне так там и не объяснили, чем оно намного лучше префорка. Может, спят там в Америке.

Deleted
()
Ответ на: комментарий от x3al

LWAN

Это тот snake oil с синтетическими бенчмарками?

Deleted
()
Ответ на: комментарий от x3al

Ящитаю автор сделал большую ошибку смешав две темы сразу: iocp и его оптимизации интерпретатора. Я мало чего понял, но пришлось перелопатить много текста.

Потом, есть и другой взгляд на производительность iocp: http://www.slideshare.net/sm9kr/iocp-vs-epoll-perfor .

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Я так понял это poll/epoll с буферизацией сокетов и уведомлением о событиях в очередь сообщений. По одной такой штуке запускается на каждое ядро.

Это как раз обратная концепция. Всякие poll/epoll/XXXnotify работают с дескрипторами: если появились данный которые можем прочитать — получаем событие.

IOCP же, работает с I/O вызовами и является чем-то типа очереди: с одной стороны пихаем запросы на вызовы, с другой стороны вытаскиваем уведомления о завершении т.е. буфер который мы передали стал валидным.

Это не вопрос плохо/хорошо. Это просто по-другому.

Macil ★★★★★
()
Ответ на: комментарий от x3al

обгоняет вообще всё, включая LWAN под линуксом

Смотри ссылку что я дал постом выше :). Не всё так однозначно и надо понимать что у него запрос и ответ в бенчмарке 73 байта. По крайней мере так в презентации было сказано.

true_admin ★★★★★
()
Ответ на: комментарий от Deleted

Тем, что тред — неверный примитив для задачи. 1 треда может перестать хватать на эвентлуп в любой момент, а с несколькими 10-гигабитными линками — особенно. Сколько и какие треды ты будешь создавать, чтобы предусмотреть всё? Сколько ты потеряешь в производительности из-за того, что не угадал и во время работы у тебя много раз всё ограничивается то IO, то вычислениями?

x3al ★★★★★
() автор топика
Ответ на: комментарий от x3al

При чем тут треды, речь о процессах.

Deleted
()
Ответ на: комментарий от x3al

Он не про треды, про форки. Но ведь как раз тут треды. Часто бывает нужно общаться между тредами и процессы тут помедленнее... Это я постману

dmxrand
()
Ответ на: комментарий от true_admin

PS а в линуксе ведь вообще вундерфафлю хотели запилить когда можно было одним системным вызовом работать сразу с несколькими дескрипторами. Видимо, сдохло :)

kqueue штоле? :)

anonymous
()
Ответ на: комментарий от anonymous

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

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

true_admin ★★★★★
()
Ответ на: комментарий от buratino

проще дропнуть поддержку винды

Если ты это написал после «tl;dr» то там речь шла совсем не о том. Там чувак восхищался iocp и рассуждал на тему почему такое нельзя сделать с epoll.

true_admin ★★★★★
()

Разработчик PyParallel считает, что оффтопик удобнее для реализации параллелизации

В винде, действительно, достаточно богатый API для многопоточности.

yoghurt ★★★★★
()
Ответ на: комментарий от forwardonly2015

Если я правильно его понимаю

with Windows, it’s a completely different situation. The whole kernel is architected around the notion of I/O completion and waitable events, not “file descriptor readiness”. This seems subtle but it pervades every single aspect of the system

Неблокирующие синхронные вызовы — это когда ты в цикле проверяешь, не освободился ли ресурс и когда он освободился — работаешь с ним. Сам цикл — синхронный, очевидно. Асинхронные — когда ты говоришь ОС (чуть ли не ядру, емнип) «вызови этот коллбэк когда данные будут готовы».

x3al ★★★★★
() автор топика
Последнее исправление: x3al (всего исправлений: 1)
Ответ на: комментарий от forwardonly2015

Вот это основная претензия к презентации. Он прямо так в презентации и говорил. Я поэтому долго вкуривал в его идеи.

Я уже забыл этот бред, но, вроде, он хотел буферизированную запись когда write() сразу принимает весь ответ. В общем, он там про вот это вещал: https://en.wikipedia.org/wiki/Overlapped_I/O

Весь паззл целиком я так и не собрал.

true_admin ★★★★★
()
Ответ на: Если я правильно его понимаю от x3al

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

Так (busy loop) никто не пишет и посыл был не об этом. Если перевести на нормальный язык то он хотел чтобы запись не блокировалась.

По сути, речь о том что

1) в винде диспатчер сообщений в ядре, а в линухе это делают в пространстве пользователя.

2) это позволяет сэкономить по обслуживающему треду на каждый event loop и делать меньше переключений между тредами

3) в винде буфер на приём-отправку общий с ядром и сетевушкой (через DMA). Интересно было бы почитать реально ли это работает. В линухе только экспериментальные средства есть для этого, ЕМНИП.

4) ядро венды умеет само управлять пулом тредов (когда какой тред разбудить и на каком проце его крутить) которые слушают очередь сообщений

true_admin ★★★★★
()
Последнее исправление: true_admin (всего исправлений: 1)
Ответ на: комментарий от true_admin

4) ядро венды умеет само управлять пулом тредов (когда какой тред разбудить и на каком проце его крутить) которые слушают очередь сообщений

Плюс когда какой тред создать, чтобы занять все ядра CPU.

Я не про busy loop, а про то, что epoll не говорит «сообщение принято», например. Он просто сигналит о том, что можешь пробовать читать.

x3al ★★★★★
() автор топика
Ответ на: комментарий от x3al

Плюс когда какой тред создать, чтобы занять все ядра CPU.

Типа того, оно будит новые треды если старые повисли на I/O и в очереди ещё есть сообщения. Интересно, можно ли так сделать в линухе и есть ли в этом смысл.

epoll не говорит «сообщение принято», например. Он просто сигналит о том, что можешь пробовать читать.

В чём разница? Если оно говорит «можешь попробовать» то значит пришли данные (исключая относительно редкие phantom events которые раньше бывали у epoll).

true_admin ★★★★★
()
Ответ на: комментарий от x3al

действительно ли ты можешь читать/писать?

O_O ты делаешь read() и получаешь данные. С вендой ты делаешь queue.get() и получаешь данные. Разницы никакой.

Разумеется, read() может вернуть ошибку. Но это не отличается от того что в queue.get вернул тебе сообщение о том что сокет, например, закрыт.

true_admin ★★★★★
()
Ответ на: комментарий от x3al

писать

Запись практически всегда буферизируется. Смысла нет в рабочем треде отдавать ответ по кусочкам если это может делать отдельный тред в бэкграунде.

Архитектура ПО принципиально не отличается от вендовой. Просто в венде часть компонентов работает на уровне ядра. В линухе это делает либа. Канонический пример: asynchat у питона.

true_admin ★★★★★
()

питон это треш, судьба сабжа грустна и печальна.

kep
()
Ответ на: комментарий от x3al

И код на бенчмарке — вполне себе питон.

Это DSL для асинхронного программирования с синтаксисом Питона.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.