LINUX.ORG.RU
ФорумTalks

[wayland mode] линупс - кривое тормозное поделие


0

3

Пока all обсуждают что лучше - wayland или legacy под названием иксы, я бы предложил поднять другую гораздо более интересную тему: ведро линупса есть окаменевший кал мамонта. Его надо перепилить

И вот почему:

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

В реальной жизни не нужно уметь mapнуть любой адрес в любой адрес. Нужно мапать сразу блобы, и в 99% случаев некритично, сколько адресного пространства потеряется из-за выравнивания. У вас много на десктопе программ, у которых по данным top виртуальной памяти по 2гига и более? А гиг? А 512 метров? я окромя ожиревших иксов и фурфокса не упомню, и то - у последнего память занимает heap, которому тоже некритично где лежать, главное лежать. а иксы... :) ну да, иксы. зачем они, когда есть wayland И современные процы позволяют это сделать. Пусть процесс содержит таблицы страниц для верхнего уровня(или среднего для x86-64) , а блобы в памяти содержат нижний уровень. Да, тогда их мапить получится лишь по адресам, кратным 4мб или 2мб. Зато форк и mmap будет мгновенным - не надо создавать на форке кучу структурок, нужных для того, чтоб следить, а кто это юзает физическую страницу, которую мы выгоняем на диск.

Мапнуть блоб к себе? Не вопрос,

memcpy(mytables+offset, blob->phys_addr_tables, sizeof(pagedescr)*((size_of_blob+big_page_size-1)/big_page_size)

Надоела страница? Не вопрос,

pagedescr * tmp=pages[index].where_is_it->phys_addr_tables;
tmp[pages[index].offset]=0;

И все действия такой же сложности примерно. Хелловордовой.

Далее, большинство библиотек и, ширше говоря, тулкитов, идет «паровозом». То есть Qt = {libQtCore + libQtGui + libQtXml + libQtNetwork + blablabla} Вот что мешает возложить на линкер боевую задачу - знать из конфига, какие либлиотеки меж собой дружат, и для каждой такой группы держать один блоб to rule them all? Сколько там стартует типовое кедоприложение из-за динамической линковки? 7500 времени? Причем тормозит из-за того, что по мнению ld-linux.so.2 все либлиотеки «разные», он их каждый раз как в первый раз видит, и заново создает .got для них. ну слинкуй ты их намертво в блоб и держи 1 .got на всех, тем более что он меньше будет, чем раздельный. А поскольку без запроса блоб в память не подкачивается, не потребуется городить какую-то модульность. Не нравится libFoo5 из libFoo[1-100]? Не обращайся, делов-то.

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

2)Терминалы - зачем это в ведре? От ведра требуется лишь «передать строку» и послать сигнал. Мне казалось, ведро уже умеет это делать. Вот честно, скажите, какая повседневная программа из консоли требует себе в stdin/stdout терминал? НЯП все нормально шуруют через пайп. От пайпа терминал отличается разве что очень полезными ioctlами, без которых жизни красноглазому нет: это установить сколько бит в байте, установить скорость в битах/секунду, и прочая лабуда. Из нового есть только костыль включить/выключить утф8. Я еще понимаю, когда речь о com-портах идет. Ну оставьте эту байду в драйвере ком-порта, зачем это в tty тащить, да еще в ведро? Вынести все в libtty.so и не держать в ведре страшное legacy. Правильно Alan Cox ушел, сколько можно подпирать костылями кучу дерьма, созданную для эмуляции ламповых печатных машинок? Размер «окна», управляющие символы - все это должно делаться в userspace. Один хрен никто в чистом терминале с моргающим курсором давно не сидит. Везде xterm, gnome-terminal, konsole и т.д. и т.п. В винде под цигвином вся эта консольная лабуда работает, хотя там в ведре никаких юниксовых терминалов нет.

3)Планировщик - вот скажите мне пожалуйста, как через nice сделать так, чтоб фоновое приложение икс и его потомки в сумме жрали не меньше 18.2% процессора, но не вытесняли остальных? Задача элементарнейшая - скажите студенту: сделай мне алгоритм, который будет делать кольцевой список задач, у которых может быть такой же список подзадач, и % минимального использования проца в секунду или min((1-reserved_time)/nprocs) если не указано, получишь зачет. Студент сделает. И этот алгоритм будет работать потому что он тупой как хелловорд. Без всяких там cfs/bfs и 12309. Почему у линупса до сих пор такой сраный планировщик, что его можно разбомбить форк-бомбой и на нем под нагрузкой звук хрюкает?

☆☆☆

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

во первых, POSIX не требует размещать код терминалов в ведре. можно на уровне userspace эмулировать эти устройства.

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

ckotinko ☆☆☆
() автор топика

и на нем под нагрузкой звук хрюкает

Это уже к Поттерингу претензии, ведро тут ни при чем.

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

я ошибся пунктом, это было не к 2, а ко второй части 1. сорри

stevejobs ★★★★☆
()

ведро линупса есть окаменевший кал мамонта. Его надо перепилить

С удовольствием почитаю, как Линус закидает тебя говном в LKML.

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

А на вытекающую отсюда совершенно дикую внутреннюю фрагментацию физической памяти тебе тоже плевать?

Зато форк и mmap будет мгновенным - не надо создавать на форке кучу структурок, нужных для того, чтоб следить, а кто это юзает физическую страницу, которую мы выгоняем на диск

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

Причем тормозит из-за того, что по мнению ld-linux.so.2

Так кто виноват то, ведро или ld.so?

Реализация плевая

но херовая

fang
()

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

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

POSIX не требует размещать код терминалов в ведре

Да. Но при этом требует ioctl-ей и, ЕМНИП, нод в /dev (даже если память мне таки изменяет и он нод не требует, их требует куча существующего софта). В рамках Linux это потребует серьезного перепила либо CUSE (последнее - заведомо бредовая идея). Твой подход правильный для микроядра, но !Ъ для монолита.

во вторых, kms переключает в текстовый режим

С каких пор? KMS всегда переключал в графический режим (fb), в котором отрисовкой букв занимается ядро.

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

Я про железячные проблемы. Это значит, что проблема никак не относится к ОС и железка одинаково не работает или глючит везде.

Deleted
()

3)Планировщик - вот скажите мне пожалуйста, как через nice сделать так, чтоб фоновое приложение икс и его потомки в сумме жрали не меньше 18.2% процессора,

Да да, скажите мне пожалуйста, как это сделать в винде, а то я уже зае..

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

Да да, скажите мне пожалуйста, как это сделать в винде, а то я уже зае..

Пока что в треде говорится, какое г***но есть ядро линукса, но никто не сказал, что в винде дела обстоят лучше.

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

ckotinko

во первых, POSIX не требует размещать код терминалов в ведре. можно на уровне userspace эмулировать эти устройства.

нельзя. Как ты в single user mode зайдёшь? что, «не нужно»? ну это тебе сейчас не нужно.

drBatty ★★
()

Давай, школьник, докажи всему миру, что ты прав, сделай патч!

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

ведущая к адовой фрагментации и тормозам

Про тормоза пожалуйста поподробнее. мне вот кажется, что копаться в дереве vm_area_struct тормознее, чем по индексу в таблице смотреть. А фрагментация - на винде вообще база образа фиксирована у дллек, и ничего, как-то живут. В игры играют трехмерные с уберграфикой и dolby surround. И это все потому, что размер кода в типовом процессе - десятки мегабайт от силы. По всей системе - дай бог сотни две метров наберется. Обосраться прям, адресного пространства не хватит.

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

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

Но при этом требует ioctl-ей и, ЕМНИП, нод в /dev

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

KMS всегда переключал в графический режим

KMS еще и консоль восстанавливает по контрол-альт-фчтототам.

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

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

В сигвине вместо ioctl подсовывают заменитель. Ты предлагаешь в Linux запилить ioctl так, чтобы он проверял, не терминал ли это, и если терминал, то обращался бы к библиотеке, а не сисколл посылал? Если так, то это такой огромнейший костылище выйдет... Да и не просто костыль, а еще и не работающий костыль (например, сломаются программы на асме, использующие сисколлы напрямую, а также программы, статически слинкованные с libc (это редкость, но все же)).

KMS еще и консоль восстанавливает по контрол-альт-фчтототам.

Это не консоль, а вполне себе графический framebuffer-mode. Истинно текстовый режим - это 80x25, отличается тем, что ядро запихивает в видеобуффер не массив пикселей (а в framebuffer-mode таки ядро запихивает в видеобуффер массив пикселей), а только символы, за их рисование отвечает другое.

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

не в форке дело. а в том, что есть две задачи - по физ.адресу найти где он лежит, и по вирт.адресу найти физ.адрес.

вторая задача тривиальна. а вот первая требует расплодить структурки. столько же, сколько виртуальных страниц. тут никак не увернуться. и при форке эту лабуду надо копировать.

избавиться от нее никак, но можно снизить её объем за счет того, что колво лабуды будет пропорционально объему PDE а не PTE

ckotinko ☆☆☆
() автор топика
Ответ на: комментарий от fang

и кстати. я имел ввиду раздельные pde но расшаренные pte. фрагментируется только адресное пространство, но в подавляющем большинстве случаев ущерб минимизируется за счет того, что библиотеки можно объединять в большие блобы. гиг блоба это метр памяти накладных расходов.

ckotinko ☆☆☆
() автор топика
Ответ на: комментарий от quantum-troll

Nuff said.

ну, после того как он говорил про оверхед от линковки как factor of two (см. вторую доку) можно себе представить скилл чувака который это писал.

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

тут никак не увернуться. и при форке эту лабуду надо копировать.

избавиться от нее никак, но можно снизить её объем за счет того, что колво лабуды будет пропорционально объему PDE а не PTE

Полный оптимизец. Экономия на семечках. Лучше не пиши в LKML, иначе будешь зачислен в batch of masturbating monkeys.

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

fang
()

у современных ос вообще очень много проблем. Причём их в упор не замечают те кто их проектирует и пишет потому что кругозор узкий. Я как раз недавно прочитал «The Good, the Bad, and the Ugly: The Unix Legacy» (не всё разделяю из того что там написано).

У меня тоже депресняк, всё вокруг говном кажется (да так оно и есть, мои поделки тоже). Какие сырцы не откроешь везде мусор и отсутсвие знания примитивнейших паттернов :(. на любом языке можно писать на FORTRAN'е (с).

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

С удовольствием почитаю, как Линус закидает тебя говном в LKML.

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

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

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

Ну, предположим, ты, действительно сильно извратишься, сильно усложнив при этом код динамического загрузчика, и минимизируешь фрагментацию, но вот что ты собираешься делать с тем фактом, что при page fault'е у тебя будут загружаться 4-х мегабайтные страницы? При этом ещё неизвестноб насколько данные всей этой страницы будут использоваться. Неплохо бы прикинуть объём накладных расходов на I/O. Или, может, ты планируешь блоб целиком держать всегда в оперативной памяти?

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

Ну поставьте себе ядро 2.4.х, там как раз 12309 нет. И планировщик простой сравнительно. Вот только работает оно медленнее.

там ... 12309 нет... только работает ... медленнее

12309 нет

медленнее

/0

Спросишь, почему не пользуюсь? Не собирают под текущую опензузю. И да, сам не буду собирать, работать надо, а не гентушничать.

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

Но ведь внутри тоже придется всё поломать? А когда бояре [kernel-dev] дерутся, кто про холопов [userspace-dev] думать станет?

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

я все понять то не могу, с чего вы решили, что речь идет о больших страницах? Я просто хочу сделать общие PTE. это которые по 4кб. А PDE будут у каждого процесса свои и они будут указывать на таблицы PTE блобов.

ckotinko ☆☆☆
() автор топика
Ответ на: комментарий от GateKeeper

GateKeeper

> 12309 нет

медленнее

/0

ты сначала попробуй, а потом говори. Нет там 12309, но работает оно медленнее. Что, думаешь кроме 12309 за 5 лет ничего нового в ядро не вставили?

GateKeeper

Спросишь, почему не пользуюсь? Не собирают под текущую опензузю. И да, сам не буду собирать, работать надо, а не гентушничать.

поставь старую сусю. 12309 появился в аккурат, когда /dev/hda заменили на /dev/sda, я так подозреваю, что проблема просто в памяти - мало тогда было памяти, рано Линус всё это намудрил. На 512Мб в десктопе ядру просто тупо не хватало памяти. Потом память все купили, её стало хватать, и баг закрыли. Но Линус не дремал, и воткнул ещё какую-то НЁХ (а чё, у него в десктопе 16Гб). Баг опять пришлось открывать, что и было сделано в начале этого года. ИЧСХ - в ядрах 2.38 никакого 12309 нет.

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

Много раз дрались, а все же холопы [userspace-dev] не пострадали.

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

Ядро 2.6.39 отлично работает на 384 Мб памяти. 2.6.32 и 2.6.26 я ставил на 128. Всё нормально.

Кстати, 12309 должен проявляться на больших объемах памяти намного сильнее.

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

Кстати, 12309 должен проявляться на больших объемах памяти намного сильнее.

Если он, конечно же, существует :)

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

franchukroman

Ядро 2.6.39 отлично работает на 384 Мб памяти.

да. баг открыли для ядер 3.х. В 2.6.х баг был закрыт.

franchukroman

2.6.32 и 2.6.26 я ставил на 128. Всё нормально.

и что? 12309 проявляется далеко не на каждой железке. Причём на железке может быть и 256Мб, но бага нет. А может быть 512 на другой, и баг есть.

franchukroman

Кстати, 12309 должен проявляться на больших объемах памяти намного сильнее.

это почему?

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

franchukroman

Если он, конечно же, существует :)

я его видел своими глазами.

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

Перечитал ещё раз. Неправильно понял тебя, да. Критичных изъянов сходу не вижу.

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

это почему?

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

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

franchukroman

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

дык тогда быстрее забьётся маленький кеш.

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

Дык сравни время сбрасывания на диск нескольких сотен мегабайт с временем сбрасывания нескольких мегабайт всего :)

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

может быть. Скорее всего я наблюдал другой 12309.

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

я под 12309 подразумеваю лютый 100% любого одного из ядер процессора (а если проц вообще один и с единственным ядром - то баг лют в квадрате) в момент VM IO. Баг в том, что пишущие приложения не делают нихрена (ждут), но те, кому нужно посчитать пару миллиардов знаков числа Пэ, вкусных тактов не получат, т.к. ядро херней страдает, а других потреблителей у ЦПУ нет.

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

ИЧСХ - в ядрах 2.38 никакого 12309 нет.

Есть. Я с 2.6.32 на тамблвидах сижу, обнюхал все версии, начиная с релизного в 11.4 опенсусе. Все тупят. Текущее 3.2.4 (кажется) такое же. Очередной раз обещали в 3.3 выпилить BKLэтот баг. Уже вагон попкорна приготовил и пару ведер говн для вентилятора.

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