|
|
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Привет друзья. Как всегда мы начинаем тяпничный сабж. Что-бы хотелось обсудить. На волне кризисов возраста и событий в рынке It многие братия-джуны утратили дух и духовность. Впали в страх и ужас и периодически сидят в углу комнаты и охавтив коленки повывают эдак - "Ыыыыыы....". На чём лучше кодить? Что лучше изучать для будущей работы? Иные мидлы впали в ереси и пытаются метаться из С++ в D а потом не дай бох во всякие Rust и даже не побоюсь этого слова GoLang у которого нет православных Exceptions. Вобщем - беда! И во всех языках и технологиях краеугольным камнем или догмой наискосок идет магическая концепция имя которой MM или GC то бишь управление памятью и уборка мусора. И любые споры или дискурсы о ЯП или системе программирования рано или поздно сводятся к вопросу - КАКОВ ЗДЕСЬ MM/GC. А бородатые синьоры сурово сдвинув брови способны слить в помойное ведро любое ваше дарованье одним лишь своим "мнением" по поводу класса MM которое вы заюзали в тестовом задании или стартапе. А каков он? MM или GC? Итак давайте обсудим современный идеальный Garbage Collector Я предлагаю очертить наши собственные требования и чаяния по отношению к GC: Идеальный GC должен: 1) Хорошо скейлится. . Тоесть при переходе с 16G кучи до 32G мы не должны наблюдать "удвоенную" нагрузку на процессы GC. 2) Иметь жестко регулируемый Stop-The-World. . Тоест грубо говоря мы должны иметь ИНСТРУМЕНТ или регулятор которым мы говорим дескыть - Мы не желаем чтобы стоп-вселенная длилась более чем 10 милисекунд. Вот так вот. 3) Иметь средства диагностики и отладки . Ну здесь как-бе все ясно. Что. Где. Когда. Детальный лог по активностям GC. 4) Иметь возможность workaround механизма GC . Как ни крути но есть ситуации когда мы сами желаем иметь прямой неуправляемый доступ к памяти и мы требуем чтобы (на свой страх и риск) у нас все таки была возможность выделять сырую память и удалять ее вручную. .... здесь можно еще дописать ваши предложения. Можно также обсудить че есть и где какие алгоритмы используются. Таблицы и графики - приветствуются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 12:51 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
mayton, Управление памятью на свой страх и риск aka возможность считывания byte/signed/usigned int/float/double/etc с указанной позиции в памяти это конечно хорошо, но толку мало - программы это структуры данных и работа с ними. Поэтому нужна нормальная поддержка указателей на структуры, которые расположены вне хипа с поддержкой на уровне рантайма, языка и его стандартной библиотеки. Желательно так, чтобы работа с ними мало чем отличалась от работы с обычными объектами на хипе. Пока это нет - в языке с GC будут STW, с долгими и мучительными паузы, или же велосипеды, которые вышеуказанное эмулируют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 13:26 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonТаблицы и графики - приветствуются. Господи, и понаписал же. А теперь смотри - идеальный менеджер памяти. Универсального идеального не может быть по определению, потому что все универсальное - это сукс. Пример - таракан - умеет и летать, и плавать и прыгать, но в сравнении с бабочкой, водомеркой и кузнечиком - делает это плохо. Пример из IT? оок. Веб приложение - паттерн - поступил запрос, его распарсили, спросили базу данных, сделали шаблон, отправили. Так вот. В этом случае достаточно просто зарезервировать, не выделить большой кусок памяти, и туда методом аппендирования добавлять объекты по мере необходимости, сдвигая указатель по мере выделения. Как только запрос будет отправлен клиенту - весь этот кусок памяти хрясь и удалется целиком, не нужно заниматься мелким анонированием вприсядку с кучей free() и прочих delete вызовов. Аллоцирование предельно быстрое, предельно быстрое деаллоцирование. Работает отлично только с одним типом приложения - веб. Для GUI такое не канает - там сидят долгосрочные, долгоживущие объекты, и нужно придумывать свою идеальную методику. Базы данных? там вообще отдельно. Там есть 64-е бита в операционках, и такая штука как mmap(). Файл базы данных можно тупо зааллоцировать как readonly в память приложения (т.е. файл базы данных читается как плоский массив байтов), и вместо того, чтоб несчастный client.name по десяткам раз туда-сюда конвертировать при запросе - просто возвращать указатель на кусок памяти, фактически на кусок файла, который отображен в память. Писать в этот кусок нельзя, потому приложение с dangling pointer базу данных не разрушит. Чтение ускоряется примерно в две-три сотни раз. И т.д. В результате типовое приложение веб-база данных можно разогнать в десятки раз. Но зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 14:07 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Кстати для GUI типов приложений ничего лучше чем ARC (automated reference counting) и Owner-Container еще не придумано (типовые реализации - Delphi, ну и все что в Cocoa/MacOSX/iOS). Там хоть время реакции на действия пользователя предсказуемо. А использовать GC в GUI, где требуется интерактивность и гарантированное время реации - это вообще финиш. Как порой радует Netbeans или Eclipse с их типовыми залепухами - сидишь, вбиваешь код, а оно такое жжжжжжж.... бац, на 10 секунд ушло в каматоз. Потом бац, ожило, ништяк, половина того, что ты вбивал пока оно тупило - потеряно. А так - отличные среды, дада. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 14:16 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaГосподи, и понаписал же. А теперь смотри - идеальный менеджер памяти. Универсального идеального не может быть по определению, потому что все универсальное - это сукс. Ну... я про универсальность не говорил. Это уже ваши домыслы, господин хороший. И кстати коли вы новичок - то знайте что каждую тяпницу я буду вас созывать на мозговой штурм. В неформальной обстановке. Тоесть галстуки на дорогих костюмах можно слегка "ослабить". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 14:52 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonnojavaГосподи, и понаписал же. А теперь смотри - идеальный менеджер памяти. Универсального идеального не может быть по определению, потому что все универсальное - это сукс. Ну... я про универсальность не говорил. Это уже ваши домыслы, господин хороший. И кстати коли вы новичок - то знайте что каждую тяпницу я буду вас созывать на мозговой штурм. В неформальной обстановке. Тоесть галстуки на дорогих костюмах можно слегка "ослабить". я новичок? атас.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 14:52 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaПример из IT? оок. Веб приложение - паттерн - поступил запрос, его распарсили, спросили базу данных, сделали шаблон, отправили. Так вот. В этом случае достаточно просто зарезервировать, не выделить большой кусок памяти, и туда методом аппендирования добавлять объекты по мере необходимости, сдвигая указатель по мере выделения. Как только запрос будет отправлен клиенту - весь этот кусок памяти хрясь и удалется целиком, не нужно заниматься мелким анонированием вприсядку с кучей free() и прочих delete вызовов. Аллоцирование предельно быстрое, предельно быстрое деаллоцирование. Здесь если заменить очередь на stack - то ничего принципиально не меняется для обработки 1 HTTP-реквеста. Например Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 14:57 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaя новичок? атас.... У тебя несколько десятков сообщений. И да.. я понимаю что своё настоящее имя ты тщательно скрыл. Стесняшка .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 14:58 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaБазы данных? там вообще отдельно. Там есть 64-е бита в операционках, и такая штука как mmap(). Файл базы данных можно тупо зааллоцировать как readonly в память приложения (т.е. файл базы данных читается как плоский массив байтов), и вместо того, чтоб несчастный client.name по десяткам раз туда-сюда конвертировать при запросе - просто возвращать указатель на кусок памяти, фактически на кусок файла, который отображен в память. Писать в этот кусок нельзя, потому приложение с dangling pointer базу данных не разрушит. Чтение ускоряется примерно в две-три сотни раз. Очень странный подход. Он годный для аналитики, и анализа исторических данных но вследствие объема (во много раз больше оперативки) я его-бы не советовал так применять. Но если у вас есть конкретный юзкейс где мы зачем-то должны в память приложения (!) прогружать файл (!) баз данных причем в режиме (!) R/O то прошу привести пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:02 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonnojavaПример из IT? оок. Веб приложение - паттерн - поступил запрос, его распарсили, спросили базу данных, сделали шаблон, отправили. Так вот. В этом случае достаточно просто зарезервировать, не выделить большой кусок памяти, и туда методом аппендирования добавлять объекты по мере необходимости, сдвигая указатель по мере выделения. Как только запрос будет отправлен клиенту - весь этот кусок памяти хрясь и удалется целиком, не нужно заниматься мелким анонированием вприсядку с кучей free() и прочих delete вызовов. Аллоцирование предельно быстрое, предельно быстрое деаллоцирование. Здесь если заменить очередь на stack - то ничего принципиально не меняется для обработки 1 HTTP-реквеста. Например Код: plaintext 1. 2. 3. 4. 5. 6. 7. это теоретически. а практически стек сильно ограничен, если говорить про многотредовость - то порой ограничен 512 килобайтами, не разгуляешься плюс не так секурно. потому стек проще реализовать самому отдельно, благо это вообще не сложно - просто передвигать указатель. плюс выделение памяти под стек vs резервирование. если резервировать через mmap(), то реально память не выделяется, хотя можно зарезервировать хоть два гигабайта - просто операционка выкусит данный диапазон из адресного пространства приложения, а выделение будет делать сама, по мере того, как ты будешь тыкаться указателем в блоки памяти этого диапазона. плюс через madvise можно сингализировать операционке, что пусть суетится и выделяет уже следующий кусок ну и большой кусок памяти имеет шанс быть выделенным через hugetlb, это дает новый класс бенефитов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:05 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaпотому стек проще реализовать самому отдельно, благо это вообще не сложно - просто передвигать указатель. Примерно так и работает Eden-space в Java. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:10 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonnojavaБазы данных? там вообще отдельно. Там есть 64-е бита в операционках, и такая штука как mmap(). Файл базы данных можно тупо зааллоцировать как readonly в память приложения (т.е. файл базы данных читается как плоский массив байтов), и вместо того, чтоб несчастный client.name по десяткам раз туда-сюда конвертировать при запросе - просто возвращать указатель на кусок памяти, фактически на кусок файла, который отображен в память. Писать в этот кусок нельзя, потому приложение с dangling pointer базу данных не разрушит. Чтение ускоряется примерно в две-три сотни раз. Очень странный подход. Он годный для аналитики, и анализа исторических данных но вследствие объема (во много раз больше оперативки) я его-бы не советовал так применять. Но если у вас есть конкретный юзкейс где мы зачем-то должны в память приложения (!) прогружать файл (!) баз данных причем в режиме (!) R/O то прошу привести пример. Ты опять видать не понял. mmap() - он не загружает файл в память приложения, с чего-бы вдруг? он просто говорит операционке: - Слушай, диапазон памяти с 9000 гигабайта по 9230 гигабайт - это отображение файла database.dbf Если приложение начнет читать что-то с 9101 гигабайта - то оок, берешь подсовываешь ему то, что лежит в 101-м гигабайте файла database.dbf при этом все эти 230 гигабайт спокойно лежат на диске, и только если приложение начнет чего-то реально читать - то только реальный режим прочитанного (с поправкой на стандартные 4096 байта страницы) и будет подкачано в память. и выдавлено из физической памяти само, если не будет уже никому не нужно. итого - все управление кеш памятью в базе данных ложится на операционную систему. Oracle, к примеру, отключает буферизацию средствами OS и занимается управлением буферным кешем самостоятельно, дублируя OS А тут ты вообще не паришься - пусть операционка сама думает, как твои данные кешировать. А если подумает плохо - ей всегда через madvise() можно подсказать, как нужно думать правильно. Прочитать там следующие 128 килобайт заранее или нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:11 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
schwaУправление памятью на свой страх и риск aka возможность считывания byte/signed/usigned int/float/double/etc с указанной позиции в памяти это конечно хорошо, но толку мало - программы это структуры данных и работа с ними. Поэтому нужна нормальная поддержка указателей на структуры, которые расположены вне хипа с поддержкой на уровне рантайма, языка и его стандартной библиотеки. Если честно - непонятно. Что за "структуры вне хипа" ? И что за хитрый указатель? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:12 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaплюс выделение памяти под стек vs резервирование. если резервировать через mmap(), то ... Под стек тоже резервирование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:14 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonnojavaпотому стек проще реализовать самому отдельно, благо это вообще не сложно - просто передвигать указатель. Примерно так и работает Eden-space в Java. Ну в Java не все сделано дурацким способом, это да. Выделяет память она в принципе разумно. И быстро. Удаляет хреново. Java потому и состоялась в web приложениях, что работает примерно так, как я выше описал. Только она не удаляет один большой кусок, она удаляет множество объектов нового поколения, потому не так сильно тупит. Но если ты не дай бог заточишься на еще объекты старого поколения, будешь там чото-удалять - то тут твоей поделки и кирдык на виртуалке - gс паузы привет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:15 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaТы опять видать не понял. mmap() - он не загружает файл в память приложения, с чего-бы вдруг? он просто говорит операционке: - Слушай, диапазон памяти с 9000 гигабайта по 9230 гигабайт - это отображение файла database.dbf Если приложение начнет читать что-то с 9101 гигабайта - то оок, берешь подсовываешь ему то, что лежит в 101-м гигабайте файла database.dbf Ну... про работу buffer pool всем известно. Тут вопрос в другом. Что мы получим если заберём у DBMS ее драгоценную память кеша блоков и отдатим для приложения? Напоминаю на минуточку что мы шарим и приложение и DBMS на 1 физическом хосте. И если вы где-то потянули одеяло - то с другой стороны станет холодно. Напоминаю также что DBMS распоряжалась кешем блоков для операций записи. И нет ли в этом возврата лет на 30 назад когда многопользовательских DBMS еще толком не было а все задачи решались ПРИЛОЖЕНИЕМ которое читало dbf-файлы? Декаденс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:19 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonschwaУправление памятью на свой страх и риск aka возможность считывания byte/signed/usigned int/float/double/etc с указанной позиции в памяти это конечно хорошо, но толку мало - программы это структуры данных и работа с ними. Поэтому нужна нормальная поддержка указателей на структуры, которые расположены вне хипа с поддержкой на уровне рантайма, языка и его стандартной библиотеки. Если честно - непонятно. Что за "структуры вне хипа" ? И что за хитрый указатель? структуры вне java heap. это и есть тот самый mmap() - нечто внешнее отображается в память. ты можешь на диапазон памяти отобразить файл, а можешь отобразить туда вообще что угодно, хоть блин видеокамеру. тебе нужно изображение в виде raw формата? да берешь просто и читаешь память с указателя такого-то по такой-то, как обычный массив байт. копирование в память при этом не происходит - данные читаются с иного устройства, чем линейки памяти. собственно в мире C так давно уже все и работает. никаких отдельных языковых средств не требуется - прочто чтение массива байт и вперед. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:20 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonУ тебя несколько десятков сообщений. И да.. я понимаю что своё настоящее имя ты тщательно скрыл. Где же тщательно? Наш старый друг отделалася фиговым листком ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:22 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
ИзопропилmaytonУ тебя несколько десятков сообщений. И да.. я понимаю что своё настоящее имя ты тщательно скрыл. Где же тщательно? Наш старый друг отделалася фиговым листком Не томи! Я тераюсь в догадках!! P.S. А кто щас не пьет! Назови! Нет я жду! (с) Аркадий Варламыч ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:25 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonnojavaТы опять видать не понял. mmap() - он не загружает файл в память приложения, с чего-бы вдруг? он просто говорит операционке: - Слушай, диапазон памяти с 9000 гигабайта по 9230 гигабайт - это отображение файла database.dbf Если приложение начнет читать что-то с 9101 гигабайта - то оок, берешь подсовываешь ему то, что лежит в 101-м гигабайте файла database.dbf Ну... про работу buffer pool всем известно. Тут вопрос в другом. Что мы получим если заберём у DBMS ее драгоценную память кеша блоков и отдатим для приложения? Напоминаю на минуточку что мы шарим и приложение и DBMS на 1 физическом хосте. И если вы где-то потянули одеяло - то с другой стороны станет холодно. Напоминаю также что DBMS распоряжалась кешем блоков для операций записи. И нет ли в этом возврата лет на 30 назад когда многопользовательских DBMS еще толком не было а все задачи решались ПРИЛОЖЕНИЕМ которое читало dbf-файлы? Декаденс? чего-то холодно? в базе данных MVCC. т.е. если ты изменяешь запись, то она не перезаписывается, а добавляется в виде нового экземпляра, и указатель памяти на старое значение client.name остается валидным, ну до тех пор, пока приложения не скажут - знаешь, друк, а нам уже не нужны данные по состоянию на час назад, все, что час назад было уже типо обновлено, можешь начать использовать повторно. это совсем иное, чем .dbf, там запись была в абсолютных координатах, без всякого MVCC, и приложениям нужно было ставить блокировки на чтение, чтоб не потерять консистентность. А тут консистентность достигается нулевыми затратами, только по причине MVCC - потому что операция "перезаписать" заменена на операцию "добавить новую версию". а так да, приложение и база данных должны быть на одном хосте. вернее в одном адресном пространстве, так вообще через mmap() можно и удаленные файлы, которые лежат на NFS томе или на SAN-е шарятся между нодами - никто такое не запрещат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:25 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaчего-то холодно? в базе данных MVCC. т.е. если ты изменяешь запись, то она не перезаписывается, а добавляется в виде нового экземпляра, и указатель памяти на старое значение client.name остается валидным, ну до тех пор, пока приложения не скажут - знаешь, друк, а нам уже не нужны данные по состоянию на час назад, все, что час назад было уже типо обновлено, можешь начать использовать повторно. это совсем иное, чем .dbf, там запись была в абсолютных координатах, без всякого MVCC, и приложениям нужно было ставить блокировки на чтение, чтоб не потерять консистентность. А тут консистентность достигается нулевыми затратами, только по причине MVCC - потому что операция "перезаписать" заменена на операцию "добавить новую версию". а так да, приложение и база данных должны быть на одном хосте. вернее в одном адресном пространстве, так вообще через mmap() можно и удаленные файлы, которые лежат на NFS томе или на SAN-е шарятся между нодами - никто такое не запрещат. Друг. Ты что-то путаешь MVCC - это классический набор фич как Oracle и MSSQL. Только дальше ты ошибаешся: то она не перезаписывается Перезаписывается еще как! Это я тебе как бывш. Ораклоид говорю. И как раз для поддержки снапшотов (курсоров) и используются ROWSCN которые проверяются при каждом чтении строки и роутятся в UNDO-сегмент если запись была уже модифицирована. Но ТЫ рассказываешь не этот алгоритм. Ты повествуешь примерно о том как работает Event Store! https://geteventstore.com/ А это другая тема чувак! Совсем другая! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:46 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonДруг. Ты что-то путаешь MVCC - это классический набор фич как Oracle и MSSQL. Какая замшелая безграмотность, госпаде. MVCC это просто принцип https://ru.wikipedia.org/wiki/MVCC а то, что я описал - это давно доступно в базе данных LightningDB. https://symas.com/products/lightning-memory-mapped-database/ которая работает именно как библиотека к прилоежнию, без всяких там серверов баз данных. тупо .lib, открываешь файл баз данных, и вперед - полный ACID и MVCC, всё по взрослому. и да - отображение файла в память через mmap(), возможность возвращать просто указатель на запись, без копирований - она потому и адски быстра, что сделано вот так. maytonТолько дальше ты ошибаешся: то она не перезаписывается Перезаписывается еще как! Это я тебе как бывш. Ораклоид говорю. И как раз для поддержки снапшотов (курсоров) и используются ROWSCN которые проверяются при каждом чтении строки и роутятся в UNDO-сегмент если запись была уже модифицирована. Но ТЫ рассказываешь не этот алгоритм. Ты повествуешь примерно о том как работает Event Store! https://geteventstore.com/ А это другая тема чувак! Совсем другая! Oracle реализует MVCC несколько иначе, чем к примеру Firebird или вот упомянутая выше LightningDB. Oracle перетирает данные на месте, а многоверсионность обеспечивает тем, что старые версии складывает отдельно в UNDO. Firebird и LMDB работают иначе - они не используют UNDO вообще, а просто добавляют новую запись при каждом изменении, ну и потом отдельно повторно используют старые версии записей, пишет туда новые данные, когда в них, в старых версиях, никто не нуждается. MVCC и там и там, сделано по-разному, но в итоге многоверсионность обеспечена, чо еще надо-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:53 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Я бы добавил: Низкие расходы на выделение памяти под объект Возможность управлять GC программно (запускать с указанием максимальной продолжительности) Низкие расходы на доступ к памяти (для полноты картины) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:54 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaКакая замшелая безграмотность, госпаде. MVCC это просто принцип https://ru.wikipedia.org/wiki/MVCC а то, что я описал - это давно доступно в базе данных LightningDB. https://symas.com/products/lightning-memory-mapped-database/ которая работает именно как библиотека к прилоежнию, без всяких там серверов баз данных. Ну уж извините. Зарос я мхом... А про эти ваши Лайтманы и прочие Рабиновичи - слышу нечасто. Да и хде они в рэйтингах и бенчмарках? Хде они в обзорах? Хде имплементированы? Награждены Орденом Ленина? Увековечены в монографиях? Или .... речь идет (мне даже страшно предположить) о некоем новом .... FVMAS? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 15:59 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
vitprofЯ бы добавил: Низкие расходы на выделение памяти под объект В большинстве GC - уже учтено. Реально выделение происходит как в queue. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:04 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
vitprofНизкие расходы на доступ к памяти (для полноты картины) Тут не совсем понятно. Например если аллоцирован array[] на 10 элементов то при доступе к индексатору идет каждый раз проверка на попадение в диапазон. Это имелось в виду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:06 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonnojavaКакая замшелая безграмотность, госпаде. MVCC это просто принцип https://ru.wikipedia.org/wiki/MVCC а то, что я описал - это давно доступно в базе данных LightningDB. https://symas.com/products/lightning-memory-mapped-database/ которая работает именно как библиотека к прилоежнию, без всяких там серверов баз данных. Ну уж извините. Зарос я мхом... А про эти ваши Лайтманы и прочие Рабиновичи - слышу нечасто. Да и хде они в рэйтингах и бенчмарках? Хде они в обзорах? Хде имплементированы? Награждены Орденом Ленина? Увековечены в монографиях? Или .... речь идет (мне даже страшно предположить) о некоем новом .... FVMAS? там все есть по ссылке. и бенчмарки и примеры использования. его библиотека реализована просто как тупейшее key-value хранилище, это не совсем база данных с SELECTами и прочем. есть обертка в виде sqlite, но то такое.... вот тебе синтетические тесты: http://lmdb.tech/bench/microbench/ вот примеры применения: https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database#Application_Support хотя какой-то чувак с highload 2014 весьма скептически отзывался, лень искать доклад, но типо есть чего еще допиливать в части безотказности при вырубании по питанию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:13 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojava, ОК. Спасибо. Но давай не уклоняться от темы. На правах топик стартера я предагаю вернуться к обсуждению идеального GC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:22 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonvitprofНизкие расходы на доступ к памяти (для полноты картины) Тут не совсем понятно. Например если аллоцирован array[] на 10 элементов то при доступе к индексатору идет каждый раз проверка на попадение в диапазон. Это имелось в виду? В частности, да. В общем, могут быть какие-то блокировки в случае многопоточности. Пример - C++ smart_ptr. Мы же общие требования формулируем!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:24 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
vitprofВ частности, да. В общем, могут быть какие-то блокировки в случае многопоточности. Пример - C++ smart_ptr. Мы же общие требования формулируем!? ОК. Обобщим! Поменьше блокирующих структур. Больше операций на основе atomic и CAS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:26 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonnojava, ОК. Спасибо. Но давай не уклоняться от темы. На правах топик стартера я предагаю вернуться к обсуждению идеального GC. так там и есть идеальный GC, в чем вопрос-то? тебе нужны long running objects? отлично - суй их в эту memory mapped database, и пусть они там и живут. объект живет себе и в базе данных и в оперативке одновременно, никакая хрень вроде Hibernate вообще не нужна - все уже зампаплено в базу данных изначально, красота. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:34 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaобъект живет себе и в базе данных и в оперативке одновременно, никакая хрень вроде Hibernate вообще не нужна - все уже зампаплено в базу данных изначально, красота. Да признаю что нулевые расходы на копирование - это привлекательно. Но такое решение не скейлится. Оно изначально проектируется под 1 хост и целиком и полностью зависит от перформанса 1 вычислительного узла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:44 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonnojavaобъект живет себе и в базе данных и в оперативке одновременно, никакая хрень вроде Hibernate вообще не нужна - все уже зампаплено в базу данных изначально, красота. Да признаю что нулевые расходы на копирование - это привлекательно. Но такое решение не скейлится. Оно изначально проектируется под 1 хост и целиком и полностью зависит от перформанса 1 вычислительного узла. как уже говорилось - NAS и SAN никто не отменял, это раз, а два - если скейлить, то все равно нужно базу данных шардить, потому там просто шардится все целиком - и приложение и база данных бьется на две части, и вперед, в чем проблема-то? или ты видел приложения, в которых можно оставить один сервер баз данных, но добавить 1024 серверов приложений вместо одного, и все не будет тормозить? да неужели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 16:55 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Все GC используют процессор для чистки, больше памяти на том же процессоре значит дольше будет идти чистка. Как ни тужься но упрешься в поиск в несортированном массиве рано или поздно. Нужно переходить на принципиально другой вид памяти, совмещенный с процессором и использовать понятие как удельная процессорная мощность на некоторый объем памяти. По аналогии с удельным давлением на грунт или удельной мощностью на массу у гусеничных машин. Хочешь танк потяжелее но с такой же подвижностью и проходимостью? сохраняй удельные параметры. Идеальная память с удельной процессорной мощностью 1.0 это САМ (Content-addressable memory) https://en.wikipedia.org/wiki/Content-addressable_memory Фиксированный по времени поиск в сколько угодно большом несортированном массиве данных. Как вариант можно делать гибридные решения с обычной памятью (попадались такие платы ускорители для баз данных но давненько это было). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 18:45 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Как быстро похудеть? - Надо меньше жрать! Вот и с памятью так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 21:08 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
uid uniqueИдеальная память с удельной процессорной мощностью 1.0 это САМ (Content-addressable memory) https://en.wikipedia.org/wiki/Content-addressable_memory Фиксированный по времени поиск в сколько угодно большом несортированном массиве данных. Как вариант можно делать гибридные решения с обычной памятью (попадались такие платы ускорители для баз данных но давненько это было). Мы так далеко уедем. Давайте отложим в сторону. Эта тема очень интересна но... пожалуйста отдельным топиком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 21:12 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonschwaУправление памятью на свой страх и риск aka возможность считывания byte/signed/usigned int/float/double/etc с указанной позиции в памяти это конечно хорошо, но толку мало - программы это структуры данных и работа с ними. Поэтому нужна нормальная поддержка указателей на структуры, которые расположены вне хипа с поддержкой на уровне рантайма, языка и его стандартной библиотеки. Если честно - непонятно. Что за "структуры вне хипа" ? И что за хитрый указатель? Вне хипа, который управляется сборщиком мусора. Указатель - объект доступа к структуре данных. Он может ничем не отличатся от обычного экземпляра класса кроме того, что GC его жизненным циклом не управляет. Но, как было верно замечено, "собственно в мире C так давно уже все и работает. " - т.е. для реализации этого в наш язык со сборщиком нужно реализовать небольшой сабсет C... От чего в принципе хотели уйти - зачем еще GC-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 21:22 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaкак уже говорилось - NAS и SAN никто не отменял, это раз, а два - если скейлить, то все равно нужно базу данных шардить, потому там просто шардится все целиком - и приложение и база данных бьется на две части, и вперед, в чем проблема-то? Меня конечно поражает легкость с которой жонглируете NAS/SAN и тому подобное. Масштабирование собственно системы хранения - это сегодня задача уже решенная для R/O. Хеширование и Hadoop в помощь. Но я обращу внимание на то что когда мы решаем задачи масштабирования в общем понимании этого слова то нам нужно решать вопросы конкурентных updates. или ты видел приложения, в которых можно оставить один сервер баз данных, но добавить 1024 серверов приложений вместо одного, и все не будет тормозить? да неужели? Не говорил я такого. И я вас тоже решительно прошу вернуться к главной теме. А именно к GC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 21:30 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Далее я напишу по сабжу. (Рассуждаю пока). Коли для уборщика мусора представляет сложность сам процесс релокации surival объектов то разумно заведомо их туда положить. Тоесть классифицировать объекты по их времени жизни. Разумеется для этого нужно ввести какой-то механизм. Например аннотации или хинты к new. Например: Код: java 1. 2. 3. 4. 5. Хинты в зависимости от среды или от компиллятора оставляют за собой право быть игнорированными. Но разработчик может помечать объекты как долгоживущие или короткие исходя из своих пониманий целесообразности. С точки зрения разработчика С++ - стековая аллокация alloca(...) - констатация того что объект виден в скоупе процедуры и копироваться не будет и должен быть деаллоцирован сразу после выхода из процедуры. Тоесть по сути это @Eden new. или Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 21:41 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Одиночный объект ты можешь сунуть в alloca, но STL контейнер уже нет - аллокатор полезет в глобал хип. И там глубока кроличья нора зависимостей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2016, 01:07 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
SiemarglОдиночный объект ты можешь сунуть в alloca, но STL контейнер уже нет - аллокатор полезет в глобал хип. И там глубока кроличья нора зависимостей. А можно всем "зависимостям" сказать дескыть - хочу alloca? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2016, 09:32 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonSiemarglОдиночный объект ты можешь сунуть в alloca, но STL контейнер уже нет - аллокатор полезет в глобал хип. И там глубока кроличья нора зависимостей. А можно всем "зависимостям" сказать дескыть - хочу alloca? можно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2016, 11:01 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
YesSql, у меня сходу нелетает. MinGW 5.30 Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2016, 12:40 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
>gcc -std=c++11 small_vector.cpp -lstdc++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2016, 13:27 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonYesSql, у меня сходу нелетает. MinGW 5.30 Код: sql 1. 2. 3. std::max_align_t определена в С++11 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2016, 13:54 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
YesSqlmaytonпропущено... А можно всем "зависимостям" сказать дескыть - хочу alloca? можно Строго говоря, alloca тут не используется, просто буфер создается на стеке. Это хуже, т.к предварительно ограничивает размер. Хотя переписать, думаю не составит проблемы. С другой стороны, тот же Мейерс пишет, что аллокаторы не всегда используются (Совет 10, 11). Хотя книжка старая, может уже починили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2016, 17:08 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Насколько я понимаю стека не так много. Тут надо покурить Windows/Linux доки по ОС и созданию потоков и процессов чтобы понять сколько стека по дефолту ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2016, 18:44 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
mayton Идеальный GC должен: 1) Хорошо скейлится. . Тоесть при переходе с 16G кучи до 32G мы не должны наблюдать "удвоенную" нагрузку на процессы GC. 2) Иметь жестко регулируемый Stop-The-World. . Тоест грубо говоря мы должны иметь ИНСТРУМЕНТ или регулятор которым мы говорим дескыть - Мы не желаем чтобы стоп-вселенная длилась более чем 10 милисекунд. Вот так вот. 3) Иметь средства диагностики и отладки . Ну здесь как-бе все ясно. Что. Где. Когда. Детальный лог по активностям GC. 4) Иметь возможность workaround механизма GC . Как ни крути но есть ситуации когда мы сами желаем иметь прямой неуправляемый доступ к памяти и мы требуем чтобы (на свой страх и риск) у нас все таки была возможность выделять сырую память и удалять ее вручную. .... здесь можно еще дописать ваши предложения. Можно также обсудить че есть и где какие алгоритмы используются. Таблицы и графики - приветствуются. для некоторых языков, важным пунктом является дешевая(быстрая) операция выделения памяти под маленький объект с короткой жизнью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2016, 19:19 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonvitprofЯ бы добавил: Низкие расходы на выделение памяти под объект В большинстве GC - уже учтено. Реально выделение происходит как в queue. как оказалось, далеко не во всех языках. ибо не во всех языках, оно столь важно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2016, 19:22 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaAn ultra-fast, ultra-compact, crash-proof key-value embedded data store Я выделил то, что сигнализирует - "дальше можно не читать". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 07:40 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonчтобы понять сколько стека по дефолтуОт мегабайта и выше, если только вы не ядрёный драйвер делаете. Плюс, может автоматически увеличиваться, если "туды покладено" нечто бОльшее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 07:46 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovmaytonчтобы понять сколько стека по дефолтуОт мегабайта и выше, если только вы не ядрёный драйвер делаете. Плюс, может автоматически увеличиваться, если "туды покладено" нечто бОльшее. Мда... если смешивать много malloc и aalloc то у нас будет пухнуть оба сегмента что в результате скорее всего приведет к нерациональному использованию места. Лучше уж наверное оставить аллокацию в куче но применить к ней стековые алгоритмы очистки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 10:24 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonЛучше уж наверное оставить аллокацию в куче но применить к ней стековые алгоритмы очистки. тогда она рискует из кучи превратиться в стек :) сейчас плавно придём к тому, что в приложении нужно иметь несколько пулов для разных нужд, и пулы для короткоживущих данных просто грохать тем или иным способом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 10:51 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
ИзопропилmaytonЛучше уж наверное оставить аллокацию в куче но применить к ней стековые алгоритмы очистки. тогда она рискует из кучи превратиться в стек :) сейчас плавно придём к тому, что в приложении нужно иметь несколько пулов для разных нужд, и пулы для короткоживущих данных просто грохать тем или иным способом. Это и есть моё предложение по поводу хинтов к операции new. По поводу JVM. Я наблюдал ее активности через графики JVisualVM и пришел к следующему. Есть мысль что необходимо минимизировать миграцию обЪектов Eden->Survival(0|1)->Old. А чтоб минимизировать нужно фактически детектировать ЧТО за объекты постоянно прыгают из Эдемского сада в "старички". Или что за алгоритм их продуцирует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 11:13 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonНо я обращу внимание на то что когда мы решаем задачи масштабирования в общем понимании этого слова то нам нужно решать вопросы конкурентных updates. у тебя дыра в общего характера знаниях. все что конкурентно - не масштабируется по определению - чем больше людей ломится в одну дверь, тем хуже с пропускной способностью. масштабирование - это как раз и есть техника разбиения общей задачи на взаимно изолированные и неконкуретные части. говоря проще - стройте побольше взаимо независимых дверей. даже вариант MxN - M серверов приложений на N баз данных - уже тупиковый, потому что каждый сервер баз данных должен поддерживать M сосединений. сервер приложений и база данных должны иметь связь 1:1 и только, иначе никакого масштабирования не будет, ваш КО а раз 1:1 - то ... какие претензии к имению одного локального сервера баз данных (а все остальное - уже коммуникации на уровне веб сервисов). простая же истина ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 12:35 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
ИзопропилmaytonЛучше уж наверное оставить аллокацию в куче но применить к ней стековые алгоритмы очистки. тогда она рискует из кучи превратиться в стек :) сейчас плавно придём к тому, что в приложении нужно иметь несколько пулов для разных нужд, и пулы для короткоживущих данных просто грохать тем или иным способом. ура, кажется кто-то начал что-то подозревать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 12:37 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonИзопропилпропущено... тогда она рискует из кучи превратиться в стек :) сейчас плавно придём к тому, что в приложении нужно иметь несколько пулов для разных нужд, и пулы для короткоживущих данных просто грохать тем или иным способом. Это и есть моё предложение по поводу хинтов к операции new. По поводу JVM. Я наблюдал ее активности через графики JVisualVM и пришел к следующему. Есть мысль что необходимо минимизировать миграцию обЪектов Eden->Survival(0|1)->Old. А чтоб минимизировать нужно фактически детектировать ЧТО за объекты постоянно прыгают из Эдемского сада в "старички". Или что за алгоритм их продуцирует. твои хинты не имеют никакого смысла. долгоживущие объекты тоже чистить нужно, понятие долгоживучести оно такое, ну не миллисекунды, секунды, тем не менее. простейший случай - внутренняя "база данных", приложение поддерживает некий внутренний мир, заселенный взаимодействующими объектами, а процессы вебсервисы просто дергают события этого мира. ну так эти объекты-в мирке тоже умирают иногда, как их чистить-то, если их - сотни гигабайт? хотя идея о неком анализаторе, когда объект по природе краткоживущий вдруг перекочевал в долгоживущие - это да. ну так это и самому можно сделать, завести себе timestamp поле, и анализировать его время от времени, вываливая в лог ругань при превышении нормативного времени жизни в чем проблема-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 12:41 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaхотя идея о неком анализаторе, когда объект по природе краткоживущий вдруг перекочевал в долгоживущие - это да. ну так это и самому можно сделать, завести себе timestamp поле, и анализировать его время от времени, вываливая в лог ругань при превышении нормативного времени жизни в чем проблема-то? Давай исходить из предположения что у меня неизвестное приложение. Про БД и ORM - ничего не известно. И я использую закрытые сущности из других библиотек. И куда я буду добавлять этот timestamp? И каким образом? Расширить? Инкапсулировать? В какой момент времени и кто будет проверять этот timestamp? Я не против анализатора но мне неясен механизм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 13:48 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaу тебя дыра в общего характера знаниях. все что конкурентно - не масштабируется по определению - чем больше людей ломится в одну дверь, тем хуже с пропускной способностью. масштабирование - это как раз и есть техника разбиения общей задачи на взаимно изолированные и неконкуретные части. говоря проще - стройте побольше взаимо независимых дверей. даже вариант MxN - M серверов приложений на N баз данных - уже тупиковый, потому что каждый сервер баз данных должен поддерживать M сосединений. сервер приложений и база данных должны иметь связь 1:1 и только, иначе никакого масштабирования не будет, ваш КО а раз 1:1 - то ... какие претензии к имению одного локального сервера баз данных (а все остальное - уже коммуникации на уровне веб сервисов). простая же истина Чувак эта тема очень интересная - но я тебя прошу. Отдельным топиком. Поднимай тему и задавай свой вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 13:50 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonЧувак эта тема очень интересная - но я тебя прошу. Отдельным топиком. Поднимай тему и задавай свой вопрос. Все что тебе нужно сделать - это самому себе - "да, я вообще не разбираюсь в масштабировании". И никаких отдельных топиков не нужно. Другим это понятно уже давно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 14:09 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonnojavaхотя идея о неком анализаторе, когда объект по природе краткоживущий вдруг перекочевал в долгоживущие - это да. ну так это и самому можно сделать, завести себе timestamp поле, и анализировать его время от времени, вываливая в лог ругань при превышении нормативного времени жизни в чем проблема-то? Давай исходить из предположения что у меня неизвестное приложение. Про БД и ORM - ничего не известно. И я использую закрытые сущности из других библиотек. И куда я буду добавлять этот timestamp? И каким образом? Расширить? Инкапсулировать? В какой момент времени и кто будет проверять этот timestamp? Я не против анализатора но мне неясен механизм. С закрытыми сущностями конечно печаль печаль. А так - я тебе просто описал подход, принятый в известных мне успешных проектах с долговременным хипом на сотни гигабайт. Они вообще ничего никогда не чистят долговременное, вместо этого они просто хранят объекты вечно, выставляя булевый флаг поле deleted и принудительно выставляя жесткую ссылку на объект, которая не позволит сбросить счетчик в ноль никогда. А очистка происходит ествественным путем - на выходных сервер перезагружается, память чистится так сказать естественным путем. Java она такая java. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 14:12 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonМда... если смешивать много malloc и aalloc то у нас будет пухнуть оба сегментаЗабудьте про сегменты. Если исключить экзотику вроде DOS и той же OS/2, CS == DS == SS == FS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 19:27 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
У сборщика мусора в Java есть одно серьёзное преимущество - не нужны hazard pointers для реализации Lock-free алгоритмов, т.к. не возникает ABA-проблемы за исключением редких случаев. Это актуально для архитектур типа x86_64, где нет LL/SC операций. Для всего остального по всем параметрам лучше или memory-reuse, или детерминированное освобождение памяти через smart-pointers. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 23:27 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
На хабре статья вышла про эволюцию сборщика мусора в Go У меня вопрос появился: почему никто не развивает работу со счетчиками ссылок? Или как там оно правильно называется. По сути как смарт-указатели из С++. Еще WinAPI использует для работы с объектами ядра. Технически реализация не сложная: присвоил ссылку на объект переменной сделал Счетчик++, освободил - Счетчик--. Получил 0, запустил деструктор. Плюсы очевидны: 1. Объект уничтожается именно тогда, когда он стал не нужен, т.е. можно управлять этим процессом, не получая остановку проги сборщиком в самый напряженный момент. 2. Возможен полноценный деструктор, а не малоприменимое недоразумение в виде финализатора, который неизвестно когда будет вызван сборщиком мусора. Минусы: 1. Постоянное изменение счетчика. Плюс надо атомарность соблюдать, т.к. сейчас все ЯП многопоточные. 2. Память под счетчик. 4 байта на объект может быть критично при большом количестве маленьких объектов. По моему минусы не такие уж и серьезные. Но, как понимаю они перевешивают плюсы раз большинство ЯП используют сборку мусора. Теоретически в любом ЯП со сборщиком мусора можно безболезненно заменить его на использование счетчиков ссылок, и это никак не потребует переписывания кода на этом ЯП, но никто не пытается. Интересно почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 13:02 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TНа хабре статья вышла про эволюцию сборщика мусора в Go У меня вопрос появился: почему никто не развивает работу со счетчиками ссылок? Или как там оно правильно называется. По сути как смарт-указатели из С++. Еще WinAPI использует для работы с объектами ядра. Технически реализация не сложная: присвоил ссылку на объект переменной сделал Счетчик++, освободил - Счетчик--. Получил 0, запустил деструктор. Плюсы очевидны: 1. Объект уничтожается именно тогда, когда он стал не нужен, т.е. можно управлять этим процессом, не получая остановку проги сборщиком в самый напряженный момент. 2. Возможен полноценный деструктор, а не малоприменимое недоразумение в виде финализатора, который неизвестно когда будет вызван сборщиком мусора. Минусы: 1. Постоянное изменение счетчика. Плюс надо атомарность соблюдать, т.к. сейчас все ЯП многопоточные. 2. Память под счетчик. 4 байта на объект может быть критично при большом количестве маленьких объектов. По моему минусы не такие уж и серьезные. Но, как понимаю они перевешивают плюсы раз большинство ЯП используют сборку мусора. Теоретически в любом ЯП со сборщиком мусора можно безболезненно заменить его на использование счетчиков ссылок, и это никак не потребует переписывания кода на этом ЯП, но никто не пытается. Интересно почему? А как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает? Бывает 2 основных вида smart-pointers: 1. shared pointers (std::shared_ptr<>) - на каждый указатель по 1 атомарному счетчику ссылок (8 bytes), использует медленные CAS-операции - ядро CPU замирает на 1000 тактов 2. hazard pointers - на каждый указатель по ~1-4*threads дополнительных указателей (8-32 bytes per thread), использует быстрые MOV-операции, сильно быстрее для многопоточных программ и оптимизируются внеочередным исполнением на CPU В ЯП с GC не пытаются переписать на указатели типа 1 (shared pointers) со счетчиком, т.к. без культуры использование общих между потоками указателей со счетчиком в многопоточной программе приведет к её замедлению. Почему ЯП с GC не пытаются переписать на указатели типа 2 (hazard pointers)? Вот как раз GC примерно так и работает, за исключением того, что hazard pointers сборщик мусора управляемый и сегментированный: - есть возможность детерминировано вручную запускать сборку мусора вызовом функции Scan() - для каждого контейнера обычно создается свой сборщик мусора (своя структура hazard pointers) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 13:54 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
GCjavaABAА как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает? бегает. и за процессорными регистрами следит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:02 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
GCjavaABAА как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает? Глубоко не вникал, но как понимаю у GC нет необходимости знать сколько ссылок на объект, достаточно флага: есть ссылки/нет ссылок. GCjavaABAиспользует медленные CAS-операции - ядро CPU замирает на 1000 тактов Как вариант: две lock-free очереди, в одну пишем указатель на объект для увеличения счетчика, во вторую уменьшение и отдельный поток на разгребание этих очередей. Только у него доступ ко всем счетчикам. Тогда не надо никакой атомарности. Можно общую очередь сделать, писать туда указатель и флаг +/-. Правда при таком подходе теряем полноценный деструктор, т.к. все равно будет задержка и запуск в другом потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:27 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
ИзопропилGCjavaABAА как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает? бегает. и за процессорными регистрами следит А есть возможность вызвать функцию принудительного сбора мусора? И есть ли возможность (вручную указывать) заносить ссылки в разные сегменты сборщика мусора, чтобы очищать только заданные сегменты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:28 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TGCjavaABAА как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает? Глубоко не вникал, но как понимаю у GC нет необходимости знать сколько ссылок на объект, достаточно флага: есть ссылки/нет ссылок. GCjavaABAиспользует медленные CAS-операции - ядро CPU замирает на 1000 тактов Как вариант: две lock-free очереди , в одну пишем указатель на объект для увеличения счетчика, во вторую уменьшение и отдельный поток на разгребание этих очередей. Только у него доступ ко всем счетчикам. Тогда не надо никакой атомарности. Можно общую очередь сделать, писать туда указатель и флаг +/-. Правда при таком подходе теряем полноценный деструктор, т.к. все равно будет задержка и запуск в другом потоке. "есть ссылки/нет ссылок" - кто-то этот флаг должен поставить, а этот кто-то как-то должен быть уверен, что больше ссылок нет в других потоках. Да, выше у меня опечатка, shared_ptr использует не CAS in loop (lock-free), а RMW-операцию (wait-free). Т.е. вместо одного wait-free (1000 тактов) счетчика использовать 2 lock-free очереди ( кол-во конкурентных потоков х 2 x 1000 тактов), в чем профит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:36 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TGCjavaABAиспользует медленные CAS-операции - ядро CPU замирает на 1000 тактов Как вариант: две lock-free очереди, в одну пишем указатель на объект для увеличения счетчика, во вторую уменьшение и отдельный поток на разгребание этих очередей. Только у него доступ ко всем счетчикам. Тогда не надо никакой атомарности. Можно общую очередь сделать, писать туда указатель и флаг +/-. Правда при таком подходе теряем полноценный деструктор, т.к. все равно будет задержка и запуск в другом потоке. Фигню я придумал. В основе lock-free теже атомарные операции. Т.е. никакой разницы в очередь писать или сразу счетчик менять. Надо затестить правда ли они такие тормозные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:37 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TDima Tпропущено... Как вариант: две lock-free очереди, в одну пишем указатель на объект для увеличения счетчика, во вторую уменьшение и отдельный поток на разгребание этих очередей. Только у него доступ ко всем счетчикам. Тогда не надо никакой атомарности. Можно общую очередь сделать, писать туда указатель и флаг +/-. Правда при таком подходе теряем полноценный деструктор, т.к. все равно будет задержка и запуск в другом потоке. Фигню я придумал. В основе lock-free теже атомарные операции. Т.е. никакой разницы в очередь писать или сразу счетчик менять. Надо затестить правда ли они такие тормозные. Если атомарный декремент сделать отложенной операцией то мы можем получить парадокс когда счетчик ссылок может быть отрицательным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:46 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonЕсли атомарный декремент сделать отложенной операцией то мы можем получить парадокс когда счетчик ссылок может быть отрицательным. Это легко решается: проверять значения счетчиков когда пуста очередь плюсования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:59 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TФигню я придумал. В основе lock-free теже атомарные операции. Т.е. никакой разницы в очередь писать или сразу счетчик менять. Надо затестить правда ли они такие тормозные. Там даже не в атомарности дело, а в том что как только возникает второй поток, то это ничем не лучше GC, потому что имеет все те же недостатки что и GC (в частности асинхронность удаления), в добавок к недостаткам смартуказателей )) Вообще кроме перечисленных выше недостатков смартуказателей самый главный это невозможность автоматического отслеживания циклических ссылок. Поэтому в языках где поставлена задача минимизировать мысли программиста и делают GC а не смартуказатели. Считается что программист не способен выбрать между shared_ptr и weak_ptr чтобы вручную убрать циклы. Вероятно создатели этих языков судят по себе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 15:05 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyТам даже не в атомарности дело, а в том что как только возникает второй поток, то это ничем не лучше GC, потому что имеет все те же недостатки что и GC (в частности асинхронность удаления), в добавок к недостаткам смартуказателей )) Лучше хотя бы тем что поток полностью асинхронный и не требует прерывания основного. С ядрами нынче проблем нет. В основном проблемы чем бы их занять. Anatoly MoskovskyВообще кроме перечисленных выше недостатков смартуказателей самый главный это невозможность автоматического отслеживания циклических ссылок. Это я как-то упустил. Тоже серьезный минус при кривых руках :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 15:18 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Насколько вообще проблема циклических ссылок актуальна? Ну... не в рамках теоретических рассуждений. А из практики. Кто может сказать что он напоролся на Cyclic reference и к чему это приводило? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 15:26 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonНасколько вообще проблема циклических ссылок актуальна? Ну... не в рамках теоретических рассуждений. А из практики. Кто может сказать что он напоролся на Cyclic reference и к чему это приводило? Я в фокспро натыкался: независимая работа нескольких форм, причем каждая хранить ссылку на контрол другой чтобы при закрытии туда перевести фокус. При закрытии одной из форм фокс завешивался намертво. Пришлось свой антизацикливатель писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 15:47 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TЛучше хотя бы тем что поток полностью асинхронный и не требует прерывания основного. С ядрами нынче проблем нет. В основном проблемы чем бы их занять. 1) Для GC необязательно останавливать потоки. 2) Асинхронность означает, что возможны ситуации нехватки памяти только из-за того что очищающий поток не успевает ее очистить (а не потому что алгоритм неоптимальный или памяти мало). Собственно это основная претензия к GC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 19:52 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TИнтересно почему?Вы уже научились гарантировать ацикличность графа ссылок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 18:25 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovDima TИнтересно почему?Вы уже научились гарантировать ацикличность графа ссылок? Как бы уже обсудили цикличные ссылки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 18:27 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TКак бы уже обсудили цикличные ссылки.Я настолько удивился, что этот вопрос не был первым, что даже не дочитал до начала обсуждения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 18:29 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovDima TКак бы уже обсудили цикличные ссылки.Я настолько удивился, что этот вопрос не был первым, что даже не дочитал до начала обсуждения. в начале это не упоминалось. Ты не почитал ответы на процитированный вопрос, т.е. недочитав начал повторять то что уже сказано. Сначала дочитывай топик, потом уже можно вопросом на вопрос. Ладно проехали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 18:32 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Затестил счетчики, результаты печальные, понятно почему от них отказались исходникMS VC 2015 Express Код: 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. Результатtest int 1074 ms // однопоточно test atomic 33306 ms // однопоточно multithread test atomic 93025 ms // первый из 3х потоков test atomic 181792 ms test atomic 215049 ms Счетчик из просто int в 33 раза быстрее std::atomic<int> и в 90 раз быстрее если второй используется несколькими потоками. Потоки честно распределились по разным ядрам, диспетчер задач показывал общую загрузку 76-77% для 4х ядер. С двумя потоками результаты такие же. В общем это вообще не вариант для многопототочных ЯП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2016, 18:57 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
ИМХУ, по результатам тестов, lock-free алгоритмы тоже не очень перспективное направление развития ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2016, 19:07 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TИМХУ, по результатам тестов, lock-free алгоритмы тоже не очень перспективное направление развития По каким тестам и какие алгоритмы? ordered map более менее масштабируются, а unordered map вообще хорошо https://habrahabr.ru/post/251267/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2016, 20:05 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
lockfree, нездоровая картинка, начинается с 2-х а не одного потока, как туда смог попасть std::map вообще непонятно, он не потокобезопасный, мутексом наверно обернули. Потом давай эту картинку растянем на нормальную шкалу, где нет 8-4 = 32-16 и увидим что все равно каждый график уходит в горизонтальную прямую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2016, 20:26 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
lockfreeПо каким тестам и какие алгоритмы? Исходники я выложил 19419141 в отличие от автора картинки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2016, 20:33 |
|
||
|
|

start [/forum/topic.php?all=1&fid=16&tid=1340661]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
427ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
126ms |
get tp. blocked users: |
1ms |
| others: | 254ms |
| total: | 855ms |

| 0 / 0 |
