company_banner

Для ядра Linux предложили систему прозрачного переноса потоков на разные ядра и хосты: Popcorn Linux



    Для ядра Linux представлен набор патчей Popcorn Linux. Это программный стек, который позволяет приложениям с общей кодовой базой выполняться на распределённых хостах. То есть приложение можно запустить на одном хосте, а во время его выполнения выполнить миграцию на удалённый хост. Многопоточные приложения могут переносить любой свой поток на любой удалённый хост.

    Более продвинутая версия Popcorn Linux позволяет приложениям одновременно выполняться на ядрах разной архитектуры (например, x86 и ARM). То есть, теоретически, часть программы можно запустить на ARM-ядре с низким энергопотреблением, а другой поток отправить на высокопроизводительное ядро x86.

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



    Программу CRIU обычно используют для «горячей» миграции контейнеров между хостами. Если она передаёт процесс Linux в другую систему, поддерживая восстановление всех видов файловых дескрипторов и других состояний, то Popcorn Linux реализует распределённую общую память, расширяя подсистему виртуальной памяти Linux. Это позволяет процессам на разных машинах наблюдать общее и согласованное виртуальное адресное пространство. Согласованность страниц виртуальной памяти различных хостов обеспечивается с помощью протокола reader-replicate/writer-invalidate. Это значит, что страницы памяти реплицируются при чтении и аннулируются при записи.

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

    Версия Popcorn Linux, представленная 4 мая 2020 года для включения в ядро, поддерживает только конфигурации x86. Программный стек в патчах содержит модифицированное ядро и библиотеку для выполнения в пользовательском пространстве.

    Существует более продвинутая версия Popcorn Linux, которая позволяет приложениям одновременно выполняться на ядрах с разной архитектурой. Эта более функциональная версия добавляет в стек ещё модифицированные инструменты LLVM-компилятора.



    В данный момент в ядро Linux предложена только более простая одноархитектурная версия Popcorn, которая не требует модификации компилятора. Исходный код гетерогенной реализации Popcorn Linux и компилятора опубликован на Github.

    Можно отметить, что недавно состоялся анонс проекта Telefork, который тоже позволяет производить «телепортацию» процесса на другой компьютер наподобие CRIU и DMTCP, только проще — буквально одним вызовом API. При выполнении вызова telefork память и связанные с процессом структуры клонируются на другой хост, на котором запущен серверный обработчик telepad.

    Telefork работает в пользовательском пространстве и не требует модификации ядра. Программа реализована в виде библиотеки Rust, хотя автор пишет, что теоретически вы можете обернуть программу в C API, а затем запустить через привязки FFI для телепортации даже питоновского процесса. Реализация составляет всего около 500 строк кода (плюс 200 строк комментариев). Как поясняет разработчик, это менее известный слой абстракции, который относительно легко выполняет то, что мы считали почти невозможным: «Телепортация вычислений может показаться невозможной или очень сложной. Вы могли подумать, что она потребует таких методов, как сериализация всего состояния, копирование двоичного исполняемого файла на удалённую машину и запуск его там со специальными флагами командной строки для перезагрузки состояния. Но нет, всё гораздо проще. Под вашим любимым языком программирования лежит слой абстракции, где вы можете выбрать довольно простое подмножество функций — и за выходные реализовать телепортацию большинства чистых вычислений на любом языке программирования в 500 строчках кода».

    Система Popcorn Linux работает на более низком уровне абстракции. Её разработчики упоминают другие попытки на Linux заменить виртуальные машины чем-то вроде репликации ядер:

    • Twin Linux (нет исходного кода)
    • SHIMOS (Single Hardware with Independent Multiple Operating Systems), тоже нет исходного кода
    • coLinux (предусматривает нативный запуск Linux под Windows XP и новее)

    Из гетерогенных операционных систем можно вспомнить инновационную систему TaOS образца 1991 года, которая параллельно работает на процессорах любых архитектур: x86, ARM, SPARC, PowerPC и т. д. Сейчас создатель TaOS Крис Хинсли делает похожий опенсорсный проект ChrysaLisp: тоже своеобразный «виртуальный процессор», который распределяется по разным физическим CPU на разной архитектуре под MacOS, Windows, Linux для x64 и Linux для Aarch64.

    Popcorn Linux можно использовать как единую операционную систему, в которой параллельно работают разные ядра Linux, а приложения запускаются параллельно на разном оборудовании. Если же запускать ядра независимо друг от друга с изоляцией приложений, то Popcorn Linux представляет собой альтернативу виртуальным машинам.

    Popcorn Linux — совместная разработка научно-исследовательской группы программного обеспечения и систем в Политехническом университете Виргинии, основанная на диссертации Дэвида Каца (сентябрь 2014 года, pdf).
    ITSumma
    Собираем безумных людей и вместе спасаем интернет

    Комментарии 20

      –10
      Вот именно так скайнет будет распространяться по компьютерам всего мира.
        +3
        Интересно, для общей виртуальной памяти ARM как-то переключают в little-endian и компилируют соответственно? И при компиляции все выравнивания переменных по «наихудшему» из поддерживаемых процессоров?
          +3
          Зачем его переключать, если для ARM Little Endian является режимом «по умолчанию»?

          >>И при компиляции все выравнивания переменных
          When compiling for a ARMv6 or ARMv7-A/R processor, the ARM Compiler will assume that it can use unaligned accesses.

          В любом случае. при компиляции переменные и так выравниваются для всех архитектур, если не указывать pack.
            0
            А, ну да, действительно (не имел дела с ARM, помнил, что они поддерживают оба варианта endianness, но почему-то в голове сидело, что там всё не так, как на x86).
            Спасибо.
              0

              Но работать будет менее эффективно же, если невровненные данные. Плюс ARMы разные бывают, но, очевидно, что в первую очередь будут пилить под мэйнстрим.

                0
                Поэтому их и выравнивают.
                Внутри кэш строки доступ к невыровненным данным может быть бесплатен,
                а вот при при пересечении кэш-строки пенальти и на последних Intel будет.
                www.7-cpu.com/cpu/Skylake.html
                64-bytes range cross penalty = 7 cycles

                www.7-cpu.com/cpu/Ice_Lake.html
                64-bytes range cross penalty = 6 cycles
                4096-bytes range cross penalty = 7 cycles (1 additional cycle over 64-bytes cross penalty).
            +2
            Интересно, какой оверхед.
              +4

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

                0
                именно. Такие проекты возникают последние 25 лет точно, а наверняка и раньше были
                  0
                  На ум приходят Plan9 и Inferno Os
              +1
              Когда-то был проект OpenMosix. Очень похоже.
                +2

                И еще был просто Mosix, без Open. Мы оба пробовали. Хорошо работало.

                +11

                Любая достаточно сложная распределённая программа содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Erlang.
                "Десятое правило Гринспена"

                  0

                  Lisp же.
                  Upd: а, ну да, в правиле про "распределённую" не было.

                  0

                  Слушайте, all — а какой юзкейс сего чуда?
                  От падения ноды это не защитит, размазать нагрузку — положим, но я не думаю что есть так уж много задач где Rythen/Xeon не осилит… Мы сегодня решаем это балансировкой входа-выхода и live migration виртуалок.


                  Правда интересно.

                    +1
                    HPC. Когда 64TB памяти мало.
                      +1

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

                        +2

                        Ну, условно, если трафик гоняется по некому 100 Gb Ethernet, то получается скорость передачи а пределе 12,5 гигабайт в секунду. Я не знаю ни одного SSD, который смог бы так же.

                          0
                          Когда мы начинаем говорить про 100Gb Ethernet, можно смело начинать сорить деньгами на raid0 из EDSFF/U.2 SSD. Будет всё равно дешевле при той же скорости.

                          Хотя я не уверен в количестве доступных PCI-E линий у таких монстров, если честно. Сложно найти спецификации.
                            0
                            Я не готов спорить предметно, но что-нибудь вроде RAID на Infiniband наверняка быстрее, если не по throughput, то по latency. При этом наверняка дешевле и накладные расходы со стороны ПО ниже.

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое