Забавные новости 0й-Ti :)

Тема в разделе "WASM.HEAP", создана пользователем UbIvItS, 18 июн 2018.

Статус темы:
Закрыта.
  1. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.455
    Адрес:
    Россия, Нижний Новгород
    Это интересный тезис. А что подразумевается под важным и производительным кодом?
    Например, на techempower в топе самых производительных веб-серверов только один сервер на си (h2o), и тот не на первом месте. Остальные - раст, джава и даже один на js.
    Я бы не рискнул назвать Руссиновича пориджем, но пусть даже так: если дедов щемят даже js’ники, конечно они кипятком писают, ведь всё, что они знали и умели, внезапно стало можно делать проще и эффективнее. Рыночек порешал. Некогда илита computer-science деклассирована до старпёров.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Ну, кстати, тоже интересно, какие сравнительно новые проекты на Цэ, которые стартанули в пределах последних лет 5, наверное, можно считать важными? Что не вспомнишь такого важного и одновременно на Цэ написанного, так это старые проекты. Тот же git начал писаться до 2005 года (до релиза тех же Растов в 2006), конечно, Торвальдс стал понимать важность безопасного кода и абстракций сравнительно недавно (или же его пориджи затроллили, что он сдался, не суть), и вряд ли он сходу стал писать git на Ржавом в 2006 году, но все же.
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Ну, это такой код, где важно как он работу работает, а не то как его исходник выглядит. Если кто подзабыл, в компилируемых языках, сорец - это не код (результат, стало быть), а лишь конфиг компилятору как создать код.
    --- Сообщение объединено, 20 янв 2024 ---
    А пользуется кто-то этими производительными ноунейм серверами или вот-вот начнут (когда ядро винды на расте перепишут)? :)

    OpenResty
    C 100.0%

    nginx
    C 97.6%
    Vim Script 1.8%
    XS 0.4%
    Perl 0.1%
    Makefile 0.1%
    Shell 0.0%

    Apache
    C 90.5%
    Python 5.7%
    M4 1.0%
    Shell 0.8%
    CMake 0.4%
    Makefile 0.3%
    Other 1.3%
     
  4. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.455
    Адрес:
    Россия, Нижний Новгород
    Противопоставляя внешний вид исходников их работоспособности, ты тоже красноречиво характеризуешь язык.
    Несколько страниц назад UbIvItS приводил подобный аргумент, мол, какая разница, какой внутри говнокод, если он делает своё дело.
    Что интересно, такие аргументы мы часто слышим от сторонников си - это звучит как оправдание страшненького кода (ведь работает же!) - но странно было бы слышать такое от гошника или джависта, ведь в нормальных языках красота кода идёт рука об руку с качеством продукта.
    Большинством из них нет: эти сервера специально написаны для бенчмарков. Мало кто поддерживает TLS, ещё меньше поддерживают HTTP2 и вебсокеты, и почти никто не умеет HTTP3. Но это характеризует производительность, которой можно добиться, если писать не на си.
    Но ты привёл хорошую статистику: 41% nginx, 13% OpenResty, 13% Apache, пусть в сумме 70%. А остальные 30?
    А ведь это большая доля рынка, и в ней самое интересное.
    Если играть в лиге взрослых веб-серверов, которые не бьют рекордов, но подходят для крупных проектов, то у нас есть Caddy на Go, ASP.NET на шарпе, Spring и Grails на джаве.
    Если хотим развернуть не сайт, а веб-приложение - Axum, Hyper, Warp (все три на расте) или Django на питоне.

    И всё-таки, какую новую годноту на си можно посмотреть на гитхабе, которую стартовали не в конце девяностых?
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Меня это позабавило: https://github.com/openresty/openresty - в репозитории есть .js, .css, .patch, .pod, но где там .c файлы? С 100%...

    По сабжу:
    1) OpenResty - первый релиз в 2009
    2) nginx - первый релиз в 2004
    3) Apache - первый релиз в 1995
    Вообще ни разу не легаси код...

    Почти любой современный (не легаси) сервис на ASP.NET сейчас на Kestrel (который на C# написан).
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    О каком качестве ты тут вещаешь? Мир захлебывается в модном молодежном говнокоде, жрущем ресурсы как не в себя. Это не технологии так развились, что в домашнюю пеку мы вынуждены пихать десятки-сотни гигов оперативы, чтобы хоть как-то работало.

    А в ядре там что, тоже шарп или какая-то пара-тройка длл на сишечке затесалась? :)
     
  7. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.455
    Адрес:
    Россия, Нижний Новгород
    А это точно из-за говнокода, или потому что задачи стали настолько сложными, что 640 килобайт стало не хватать?
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Точно.

    https://cracklab.team/index.php?threads/1171/post-12907
    Что это за задачи там опера решает с пустой вкладкой, что ей столько надо? :)
     
    Последнее редактирование: 21 янв 2024
  9. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.455
    Адрес:
    Россия, Нижний Новгород
    А что там? Без акка не пускает…
     
  10. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Ну покажи мне, где эта пара-тройка длл? Особенно, когда сервер под Линуксом собирается или под Макосью.

    Так чтож спецы не напишут легковесный браузер на сишечке? Или на сишечке такой большой проект не написать?
     
  12. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.455
    Адрес:
    Россия, Нижний Новгород
    А то, что gnome-system-monitor (диспетчер задач) съел 700 мегабайт, никого не смутило?

    На самом деле, автор скрина немножко (множко) лукавит, обрезав со скрина заголовки столбцов, потому что там написано "Virtual Memory".
    Давайте посмотрим, сколько на самом деле потребляет браузер:

    upload_2024-1-21_13-29-1.png

    И внезапно с терабайта мы скакнули до 30 мегабайт на страничку.

    А вот теперь надо разобраться, что это за цифры и как они считаются.
    Это актуально и для винды, поскольку в виндовом диспетчере тоже можно настроить отображение разных метрик памяти, которые тоже могут писать огромные числа, не соответствующие тому, что мы вкладываем в термин "потребление памяти":
    upload_2024-1-21_13-34-56.png

    Virtual Memory - это суммарный размер всего виртуального адресного пространства процесса:
    - Вся выделенная процессом память.
    - Вся разделяемая между другими процессами память библиотек.
    - Стеки.
    - Отображения, которые могут не занимать физической RAM (в зависимости от того, что отображается), но занимают диапазоны в виртуальной памяти.
    - Отображённая память GPU.
    - Память в файле подкачки, которая в данный момент не загружена в RAM.

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

    Shared Memory - сколько памяти из метрики Resident Memory разделяется с другими процессами (т.е., присутствует в одном экземпляре в RAM).

    Memory - сколько по-настоящему уникальной памяти потребил процесс (фактически, сколько памяти процесс выделил сам).

    Именно метрика "Memory" показывает то, что мы подразумеваем под потреблением памяти, поскольку нам не требуется учитывать память библиотек и отображения, которые или расходуют память в одном экземпляре на всю систему, или не расходуют память вообще.
     
  13. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Ахахах, ну это смешно, но это ничуть не отменяет вопроса о том, почему спецы до сих пор не сделали свой браузер? Который, как мы уже выяснили, будет состоять исключительно из сверх быстрого гуанокода, ведь не важно, как код выглядит, если он работает, ну падает в сегфолт, ну и пусть падает. Ну и бонусом возможность запуска под XP SP2, конечно же.
     
  14. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Ой, спасибо, внучки, что пояснили деду значение термина "виртуальная". Но вопрос был в том, кокие токие современные сверхзадачи решает рендер оперы на которые потребовалось зарезервировать полтора, блдь, терабайта адресного пространства. Про шаред модули это все, конечно, интересно, вот только даже если я всю систему со всеми файлами (включая каталог porn) джважды смаплю в процесс, столько не наберется :)
     
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Дедушке бы еще научиться гуглить, вместо того, чтобы орать про говнокод пориджей: https://docs.google.com/document/d/1HSap8-J3HcrZvT7-5NsbYWcjfc0BVoops5TDHZNsnko/mobilebasic
     
  16. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Rel,
    А, так это с какой-то целью было сделано. А я то думал, они просто по приколу VirtualAlloc(MEM_RESERVE) вставили, посмотреть, что получится...
    Навыделяют в бравзерах терабайты оперативки и пишут потом в резюме, что они у мамы бигдата инжениер :)
     
  17. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.455
    Адрес:
    Россия, Нижний Новгород
    Дополню Rel'а: можно посмотреть, как эти Guard Pages выглядят в действительности.
    Читаем карту памяти:
    Код (Bash):
    1. cat /proc/1234/maps
    где 1234 - любой PID оперы (можно получить через pidof opera).
    Получим большой список со всеми регионами:
    Код (Text):
    1.  
    2. 16a800000000-16a900000000 ---p 00000000 00:00 0
    3. 16a900000000-16a900100000 rw-p 00000000 00:00 0
    4. 16a900100000-16a900121000 ---p 00000000 00:00 0
    5. 16a900121000-16a90013f000 rw-p 00000000 00:00 0
    6. 16a90013f000-16a900141000 ---p 00000000 00:00 0
    7. 16a900141000-16a90015f000 rw-p 00000000 00:00 0
    8. 16a90015f000-16a900161000 ---p 00000000 00:00 0
    9. 16a900161000-16a90017f000 rw-p 00000000 00:00 0
    10. 16a90017f000-16a900181000 ---p 00000000 00:00 0
    11. 16a900181000-16a90019f000 rw-p 00000000 00:00 0
    12. 16a90019f000-16a9001a1000 ---p 00000000 00:00 0
    13. 16a9001a1000-16a9001bf000 rw-p 00000000 00:00 0
    14. 16a9001bf000-16a9001c1000 ---p 00000000 00:00 0
    15. 16a9001c1000-16a9001df000 rw-p 00000000 00:00 0
    16. 16a9001df000-16a9001e1000 ---p 00000000 00:00 0
    17. ...
    18.  
    Можно заметить, что каждый физически выделенный регион перемежается зарезервированным участком с PROT_NONE (у которых атрибуты защиты ---p).
    Эта память не расходуется в RAM (не считая небольшого оверхеда на сам факт резервирования этих участков, но там копейки).

    Можно немножко поиграть в data science и посмотреть, что мы отсюда можем вытащить.
    Давайте отсортируем этот список и сложим размеры по категориям, плюс выведем размер каждого региона:
    Код (Python):
    1.  
    2. def fmt_size(size: int) -> str:
    3.     if size < 1024:
    4.         return str(size) + " Bytes"
    5.     elif size < 1024 * 1024:
    6.         return str(size // 1024) + " KBytes"
    7.     elif size < (1024 * 1024 * 1024):
    8.         return str(size // (1024 * 1024)) + " MBytes"
    9.     else:
    10.         return str(size // (1024 * 1024 * 1024)) + " GBytes"
    11.  
    12. file = open("./maps.txt")
    13. total_size = 0
    14. ranges = []
    15. for line in file:
    16.     range = line.split(' ')[0].split('-')
    17.     begin = int(range[0], 16)
    18.     end = int(range[1], 16)
    19.     size = end - begin
    20.  
    21.     ranges.append({
    22.         "end": end,
    23.         "size": size,
    24.         "line": line.rstrip()
    25.     })
    26.  
    27.     total_size += size
    28.  
    29. lib_size = 0
    30. stack_size = 0
    31. heap_size = 0
    32. reserved_size = 0
    33. allocated = 0
    34. by_size = sorted(ranges, key = lambda entry: entry["size"])
    35. for entry in by_size:
    36.     if '/' in entry["line"]:
    37.         lib_size += entry["size"]
    38.     elif "[stack" in entry["line"]:
    39.         stack_size += entry["size"]
    40.     elif "[heap" in entry["line"]:
    41.         heap_size += entry["size"]
    42.     elif "--p" in entry["line"]:
    43.         reserved_size += entry["size"]
    44.     else:
    45.         allocated += entry["size"]
    46.  
    47.     print(fmt_size(entry["size"]), entry["line"])
    48.  
    49. print()
    50. print("Total size: " + fmt_size(total_size))
    51. print("Lib size: " + fmt_size(lib_size))
    52. print("Stack size: " + fmt_size(stack_size))
    53. print("Heap size: " + fmt_size(heap_size))
    54. print("Reserved size: " + fmt_size(reserved_size))
    55. print("Allocated: " + fmt_size(allocated))
    56.  
    И получится примерно такое:
    Код (Text):
    1.  
    2. ...
    3. 256 MBytes 34a8d0000000-34a8e0000000 ---p 00000000 00:00 0
    4. 512 MBytes 55dae0000000-55db00000000 ---p 00000000 00:00 0
    5. 1023 MBytes 7ff4101d0000-7ff4501b0000 ---p 00000000 00:00 0
    6. 1023 MBytes 7ff4541d0000-7ff4941b0000 ---p 00000000 00:00 0
    7. 3 GBytes 16a90023f000-16aa00000000 ---p 00000000 00:00 0
    8. 4 GBytes 16a800000000-16a900000000 ---p 00000000 00:00 0
    9. 15 GBytes 270800b62000-270c00000000 ---p 00000000 00:00 0
    10. 16 GBytes 1a5bfffff000-1a6000000000 ---p 00000000 00:00 0
    11. 32 GBytes 35ea00000000-35f200000000 ---p 00000000 00:00 0
    12. 1055 GBytes 35f200280000-36fa00000000 ---p 00000000 00:00 0
    13.  
    14. Total size: 1131 GBytes
    15. Lib size: 458 MBytes
    16. Stack size: 164 KBytes
    17. Heap size: 0 Bytes
    18. Reserved size: 1130 GBytes
    19. Allocated: 128 MBytes
    20.  
    Вот и получился наш терабайт, а Allocated близко к тому, что мы видим в Resident Size в gnome-system-monitor.
     
  18. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Так там написано, чтобы избежать эксплойтов в движке V8, типа положить все JS-объекты в большой блок памяти и адресовать их по смещению, а не по адресу, а все остальное далеко от него, чтобы у мамкина хацкера не было возможности сконструировать ArrayBuffer и тому подобное и прочитать или записать память, которая принадлежит бразеру, а не движку.
     
  19. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Rel,
    А, вот оно что. А 40-битные смещения, чтобы точно на все хватило. Ну, мало ли, какой сайт попадется, вдруг количество js-объектов переполнит uint32_t. Теперь-то понятно, где говнокод, а где развитие технологий, лол :)
     
  20. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    362
    Си всратый язык, примитивный. Хуже ассемблера. Это как язык рабов. Рабы в Древней Греции выполняли самую тупую, примитивную, скучную, однообразную, надоедливую работу. Месили глину, ворочали горящие угли железным стержнем. Такие же рабы программисты на Си.
     
    CaptainObvious нравится это.
Статус темы:
Закрыта.