G72K
go:gen , protobuf, grpc
Oleh
спс
Nik
Но меня смущает, что переустановка буферов деградирует производительность чтения.
Oleh
ну так там наверника же лок стоит
G72K
Если не из Go то самый сок Ragel :)
Vasily
Если не из Go то самый сок Ragel :)
для го он тоже работает
Daniel
Да. Из самого жирного - syscall на чтение запись 48%(это вроде хорошо). Потом фтючерсы, а дальше слабопонятро.
это из сети, или с диска? если с диска - надо буферизованный ридер использовать
Nik
Циклом читаю 64, потом смотрю сколько данных, читаю их, все склеиваю и шлю на хендлинг
Daniel
вот тут тоже хорошо бы буферизацию приспособить
Daniel
чтобы не на каждое чтение сискол был
🎉
оу, оказывается линтер не стоял... сколько я о себе узнал и о своём коде када поставил)))
Slava
А в мае есть какие-то интересные конференции в россии??
Nik
Или я чего то не умею
G72K
Пусть плавает
G72K
Оно читает кусками, а вы из него побайтово
Nik
(Наверно писать лучше тоже также)
Nik
Спасибо за мысль, завтра попробую закодить
Nik
Кстати, кто завтра в Badoo идёт?
🎉
Кстати, кто завтра в Badoo идёт?
Так тама одни пэхэпэшнеги имхо.
Zver
Так тама одни пэхэпэшнеги имхо.
Вроде бы же и на гоу какие-то сервисы делают.
Yura
вот да, нечто похожее
Если мапа с функциями сожрала память, значит ты пихал в нее жирные замыкания. А вообще, тот же самый тарантул использует асинхронный протокол, и драйвера спокойно выжимают сотни тысяч rps без всякого трэша, который тебе @onokonem тулит. Правда, с другим трэшем. Вот один драйвер: https://github.com/tarantool/go-tarantool Вот другой: https://github.com/viciious/go-tarantool Второй, думаю, читать полегче будет. (Первый - мой на половину. На ту половину, что читать труднее 😔 )
🎉
Вроде бы же и на гоу какие-то сервисы делают.
Ну вот видео, да они как раз чото пилить на го начали https://www.youtube.com/watch?v=uO268voCGwA&t=853s
Yura
Да чтобы мапа с функциями сожрала десятки гигов, там размер ее должен на милионы исчисляться наверное.
Проблема не в мапе, а в точ, что в нее положили. Если каждое замыкание с собой случайно по мегабайту захватило, то все получится. Другой аспект: если мапа в каналы, то этих каналов кто-то ждёт, и получается естественный тротлинг. А в мапу замыканий можно пихать "без остановки". Но это тоже гипотеза.
Yura
Вообще, каждый канал весит около 200 байт (не считая буфера под значения). А func - от 8ми байт. Вопрос только, что func в себя замкнул.
Zver
В замыкании мегабайт иметь тоже постараться надо. Массивные данные в основном ссылочные и в куче валяются. В общем там какая-то хрень. )
Yura
Замыкается ведь не "стэк", весь граф достижимых по ссылкам объектов.
Yura
"замыкается" - это не значит "копируется". Это значит "не умрет раньше замыкания".
Yura
BTW, BlackTrojan чьих рук дело? Давай поговорим лично, зачем прячешься?
Zver
BTW, BlackTrojan чьих рук дело? Давай поговорим лично, зачем прячешься?
Вам тоже пришло сообщение с гифками только что?
Yura
Да. Думал, что это личное. Видимо, кто-то просто по чату спамит.
Yura
Или тебя взломали, или ты - гондон.
Yura
Не знаю.
Хммм... Ну ты определись.
Anonymous
Хммм... Ну ты определись.
Ответ неправильный.
Yura
Похоже, это бот.
Anonymous
Похоже, это бот.
Ответ неправильный. Клуб кожевников два блока вниз.
Anonymous
Такие буферы гигантские. Это же если соединений тысячи, они всю память сжирать будут.
> Такие буферы гигантские Если вы понимаете, о чём он. 👌
Nik
Работаю в 1 коннект
Nik
Так тама одни пэхэпэшнеги имхо.
Там вообще делать нечего хотите сказать?)
Yura
Минимал. Анмапшал, печать сообщения, маршал, отправка того же сообщения обратно
Я может тогда не правильно понял. Это клиент, или сервер?
Yura
Если сервер, то зачем мапа?
Nik
Клиентов много, общения через сервер, каждый клиент имеет свои уникальные функции
Yura
Клиент
А зачем обратно отсылаешь?
Nik
Бенч тесты кстати накрутил, анмаршал/маршал работает быстро
Yura
В общем: замыкания - это клёво. Я люблю замыкания, хоть это и не Go-way. Но в цикле чтения из сокета можно звать только легкие замыкания: например, ту же посылку в канал/закрытие канала (вариант WaitGroup.Done() ). Ещё вместо замыкания можно использовать интерфейс, если нужно более одной функции.
Yura
Основной затык с этой асинхронщиной: как правильно пайплайн организовать. Обычно делают одну пишущую горутину, и одну читающую. Запросы пишущей едут по каналу. Читающая закрывает запросы (выбирая их из мапы). Надеюсь, ты примерно так и сделал. Второй затык: как ту саму мапу заполнять. Если под одним мьютексом, то больше 100крпс в среднем не выходит, по разным причинам. Потому приходится шардить мапу, чтобу а шарда был свой мьютекс. Если цель - максимальный перформанс, то маршалить нужно в клиентской горутине. Если же в реальности меньше 100krps, то может оказаться выгоднее в пишущей горутине (если будет успевать), т.к. тогла запросы будут чаще в нее пачками попадать. Btw если слать по одному запросу в канал в сторону писателя, то это тот же мьютекс (канал реализован через мьютекс). Я у себя нагребаю слайс запросов, но в канал шлю номер шарда когда добавляю первый запрос в слайс шарда.
Nik
Основной затык с этой асинхронщиной: как правильно пайплайн организовать. Обычно делают одну пишущую горутину, и одну читающую. Запросы пишущей едут по каналу. Читающая закрывает запросы (выбирая их из мапы). Надеюсь, ты примерно так и сделал. Второй затык: как ту саму мапу заполнять. Если под одним мьютексом, то больше 100крпс в среднем не выходит, по разным причинам. Потому приходится шардить мапу, чтобу а шарда был свой мьютекс. Если цель - максимальный перформанс, то маршалить нужно в клиентской горутине. Если же в реальности меньше 100krps, то может оказаться выгоднее в пишущей горутине (если будет успевать), т.к. тогла запросы будут чаще в нее пачками попадать. Btw если слать по одному запросу в канал в сторону писателя, то это тот же мьютекс (канал реализован через мьютекс). Я у себя нагребаю слайс запросов, но в канал шлю номер шарда когда добавляю первый запрос в слайс шарда.
Чтение/запись так и сделал (+плюс пишут, что методы tcpconn потокобезопасны, хочу попробовать писать лично из зендлера)
Nik
Маршалю/анмаршалю как раз на хендлере.
Yura
А вообще, какой боевой rps предполагается? Предлагаю исходить из него. И если какая-то простая схема его перекрывает в два-три раза, то лучше остановиться на ней, и не усложнять.
Nik
А мапа инится до старта обмена, в нее закладываются замыкания по ключам, дальше только чтение. Я ее даже без мьютексов собрал, учитывая что она юзается только на чтение
Nik
А что является ключом мапы?
Тип сообщения. 4байта из сообщения, переведённые в стринг
Nik
SAVE/GET_/итд
Nik
На хендинге выбираю именно эти 4 байта, по ним хендлю, и сырое сообщение кидаю в канал (или в замыкание)
Yura
Почему мне это сервер напоминает, а не клиент?
Nik
Почему мне это сервер напоминает, а не клиент?
Хз. Фактически это клиент, потому что сервер роутит сообщения по микроскосервисам
Nik
А сам микросервис можно по сути и сервером обозвать)) он хендлит запросы для него, и обращается к соседям по необходимости
Nik
Ок) пусть будет)
Nik
Это мне ща погоды не сильно поменяет
3030
Коллеги, подскажите переползающему на го. Есть protobuf-структура (Event) и обертка для массива этих структур (Events), тоже protobuf. Есть логика, которая получает через канал эти события (Event) и при определенных условиях, собирает пачку событий, запаковывает их в Events и через proto.Marshal сериализует их в файлик в бинарном виде. Понадобилось сделать аналогично для другой структуры, пытаюсь понять как правильно вынести привязку именно к этим Event(s), что бы логика сбора, сериализации и записи в файл осталась в одном месте.
Nik
И да, вопрос сбоку - чем плох митап баду? (Может я зря проснулся так рано)
Yura
Мало того, я не считаю, что все пхпшники .... Наверняка те, что работают в Badoo, адекватные люди, у которых можно чему-то научиться.