
Daniel
17.02.2017
14:54:40
Если его нет - уде хорошо

Alexander
17.02.2017
14:54:47
Memcpy бе выделения памяти не получится
и это - syscall

Daniel
17.02.2017
14:55:11
О том и речь

Google

分解物質
17.02.2017
15:00:18

Alexander
17.02.2017
15:01:16
и все это - безо всякого выделения памяти!
а главное - зачем? :)
если ядро операционной системы чем-то не устраивает, наверное, пора менять профессию, в конце концов :)
Или писать свой стек ТЦП/ИП прямо на Go, заворачивать весь траффик туда и там уже прямо без выдеения памяти можно делать что хочешь. Но проще профессию поменять :)
А скорей всего, и драйвера Ethernet придется самому писать...
Блин, что-то злые тут все сегодня, даже я :(

N
17.02.2017
15:20:05
я вообще нить дискуссии потерял. у сокета TCP есть буфер на чтение/запись, что в винде, что в линуксе. там накапливаются данные, которые можно вычитать, если говорим о чтении. а как вычитывать и выделять ли память под большие куски это уже разработчику решать, при чем тут выделение памяти и написание своего стека прям мне не понятно

Alexander
17.02.2017
15:23:01
а прочитать как?

N
17.02.2017
15:24:53
вариант на Go интересует как я понимаю?

Daniel
17.02.2017
15:24:58
Коллеги, вы странные

N
17.02.2017
15:28:27

Alexander
17.02.2017
15:29:03
к словам придираемся, как дети малые, а это не по-хипстерски

Google

corpix
17.02.2017
15:29:51

Alexander
17.02.2017
15:30:10
хипстеры обычно добрей, и о чем бы они не говорили, они всегда говорят "как бы" и делают доброе умное лицо

Sergey
17.02.2017
15:31:11

Alexander
17.02.2017
15:31:14
то есть хипстерам все, как бы, глубоко монопенисуально на самом деле, так что нечего к слова цепляться!

N
17.02.2017
15:31:20

Alexander
17.02.2017
15:31:45
это выделение памяти!

N
17.02.2017
15:32:33
да, разовое. ацептишь коннект и все чтения через один буфер гоняешь

Alexander
17.02.2017
15:33:08
ужос кокой! А если сразу два коннекта?

N
17.02.2017
15:35:30
можно так, можно через sync.pool еще буферы выделять и отдавать в пул как коннект закрывается
вариантов просто дофига

⠀
17.02.2017
15:39:25

Alexander
17.02.2017
15:40:25
странные вы, коллеги. Человек же сказал - без выделения памяти. Зачем обсуждать тут всякие левые варианты?

Daniel
17.02.2017
15:41:07
да, так вот

⠀
17.02.2017
15:41:36
пришло - обработал

Daniel
17.02.2017
15:42:34
я повторюсь
вы странные
что нам возвращает ядро?

⠀
17.02.2017
15:42:59
простите, я не хотел

Google

Daniel
17.02.2017
15:43:06
оно возвращает нам указатель на буфер
с выделением памяти - это с копированием данных из буфера в наш собственный буфер
без выделения - это с использованием того буфера, что вернуло ядро

Alexander
17.02.2017
15:44:50
ну вот :( А говорят, на Go только хипстеры пишут. А они добрые и не зануды...

Alexander
17.02.2017
16:09:29

N
17.02.2017
16:16:53
без выделения - это с использованием того буфера, что вернуло ядро
не верно. использовать тот буфер, что использует ядро нельзя. чтобы считать из сокета нужно передать указатель на свой буфер и длину. другими словами не выделяя память считать из сокета что-либо нельзя в принципе (мои слова легко подтверждаются описанием сигнатуры функции recv в sys/socket.h)

Daniel
17.02.2017
16:17:14

Alexander
17.02.2017
16:18:15
Дайте мне ведерко с попкорном, пожалуйста!

N
17.02.2017
16:18:23

Slach
17.02.2017
16:19:20
можно я еще немножечко вброшу? ?
https://github.com/golang/go/issues/3661

Daniel
17.02.2017
16:53:42

Slava
17.02.2017
16:55:15

Daniel
17.02.2017
16:55:40
да я вот гуглю что-то внятное, и пока не нагуглил

N
17.02.2017
17:03:11
это вы просто не в курсе, как работает AIO
epoll/kqueue/iocp? не вкурсе только о kqueue. кроме обвязки (в сравнении с простой реализацией) все тоже самое чтение, что я описал выше - в recv отправляется указатель на буфер и длина и ядро в пользовательский буфер пишет данные из буфера сокета и возвращает кол-во записанных

Daniel
17.02.2017
17:05:25
ну так вот это не так

N
17.02.2017
17:06:03
https://www.codeproject.com/Articles/13382/A-simple-application-using-I-O-Completion-Ports-an
https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/
держите по iocp и epool - читайте

Daniel
17.02.2017
17:23:22
http://yusufonlinux.blogspot.ru/2010/11/data-link-access-and-zero-copy.html

N
17.02.2017
17:34:44

Google

Daniel
17.02.2017
17:36:23
насколько я понимаю - синхронный IO этим механизмом не снабжен. но могу и ошибаться.
zero-copy повышает производительность сетевых серверов в разы, насколько я помню - memcpy очень дорогой, очень

N
17.02.2017
17:38:08
синхронный от асинхронного отличается только тем кто опрашивает набор сокетов о наличии в них данных, об ошибках и тд и тп - либо пользовательский код либо ядро. коротко в общих чертах это именно так, а в остальном работа с сокетом ничем не отличается от синхронного варианта или варианта через select

Daniel
17.02.2017
17:38:10
а не понимаете вы того, что в современном мире получение данных из сокета может - и должно - обходиться без этого самого memcpy

Roman
17.02.2017
17:39:04

Daniel
17.02.2017
17:39:18
это правда

N
17.02.2017
17:39:22

Daniel
17.02.2017
17:39:24
это рома прав
только не memcpy оно делает, а mmap

N
17.02.2017
17:40:16
чем мой ответ отличается от этого?
epoll/kqueue/iocp? не вкурсе только о kqueue. кроме обвязки (в сравнении с простой реализацией) все тоже самое чтение, что я описал выше - в recv отправляется указатель на буфер и длина и ядро в пользовательский буфер пишет данные из буфера сокета и возвращает кол-во записанных
на самом деле не так ) пользователь предоставляет ядру буфер, в который ядро делает memcpy :)

Roman
17.02.2017
17:40:29

N
17.02.2017
17:42:53
угу там про AF_PACKET
про пачку буфферов я вариант предложил выше, через Sync.pool например

Roman
17.02.2017
17:43:21

Daniel
17.02.2017
17:43:33
но не для сети

N
17.02.2017
17:43:35
но тут эксперты говорят я не понимаю ничего в сокетах

Daniel
17.02.2017
17:44:14
сетевой буфер можно без единой аллокации, кроме первичной, протащить от входа до выхода

Google

Daniel
17.02.2017
17:44:43
по дороге прямо в нем поменяв соответсвующие поля

Roman
17.02.2017
17:45:15
но не для сети
увы, для сети тоже. я вчера как раз развлекался с recvmmsg/sendmmsg

Daniel
17.02.2017
17:46:18
ну, хорошо
я вот вчера с ними не развлекался, поэтому спорить не буду
когда я развлекался с ними в последний раз - лишних аллокаций в java nio не было

Roman
17.02.2017
17:47:40
вообщем, там в топе copy_user_enhanced_fast_string
0,46 │ mov %edx,%ecx
97,27 │ rep movsb %ds:(%rsi),%es:(%rdi)
0,08 │ xor %eax,%eax
и вот как-то так она выглядит в профайлере

N
17.02.2017
17:48:30
:)

Roman
17.02.2017
17:56:03

N
17.02.2017
17:56:15
да у меня тоже это был сарказм)

Roman
17.02.2017
17:57:50
вообщем-то у проблем у Михаила Монашева немного

Daniel
17.02.2017
17:58:43
да рази ж дело в михаиле?..

Roman
17.02.2017
18:00:24
1) в go нет sendmmsg/recvmmsg

Daniel
17.02.2017
18:00:36
зёпа

Roman
17.02.2017
18:01:18
2) в go нет какого-либо api чтобы переиспользовать буфер
вообщем-то, всё это решаемо
написанием своих велосипедов )

N
17.02.2017
18:01:43