@gogolang

Страница 128 из 1630
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
А скорей всего, и драйвера Ethernet придется самому писать...
DPDK уже упоминали? Я не тыкал, но вот это выглядит интересно http://dpdk.org/doc/guides/prog_guide/mempool_lib.html

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

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

N
17.02.2017
15:31:20
а прочитать как?
buf := make([]byte, 4096) n, err := conn.Read(buf)

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
ужос кокой! А если сразу два коннекта?
на каждый коннект по буферу небольшому. bufio.NewReaderSize(conn, 4096)

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

вариантов просто дофига

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 только хипстеры пишут. А они добрые и не зануды...

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

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
что с чем? ядро буфер не возвращает никакой
это вы просто не в курсе, как работает AIO

Slava
17.02.2017
16:55:15
это вы просто не в курсе, как работает AIO
Скиньте ссылку людям на какое-то описание, так будет проще

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
http://yusufonlinux.blogspot.ru/2010/11/data-link-access-and-zero-copy.html
ну сырые сокеты то зачем? про zero-copy тоже понравилось. какое отношение к AIO это имеет и что я в итоге не понимаю?

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
ядро выделяет буфер, и читает данные в него
на самом деле не так ) пользователь предоставляет ядру буфер, в который ядро делает memcpy :)

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

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
Да хрен с ними с сисколами и ядром. Главное, как память-то не выделять на каждое заходящее UDP, но читать его и долго потом думоть?
элементарно. аллоцируем пачку(допустим, 1024 шт) буферов по 2048 байт и пользуемся этим пулом.

http://yusufonlinux.blogspot.ru/2010/11/data-link-access-and-zero-copy.html
я линк не открывал, но скорее всего там говорят про AF_PACKET и packet_mmap

N
17.02.2017
17:42:53
угу там про AF_PACKET

про пачку буфферов я вариант предложил выше, через Sync.pool например

Roman
17.02.2017
17:43:21
только не memcpy оно делает, а mmap
для большинства сисколлов всё-таки memcpy.

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
вообщем, там в топе copy_user_enhanced_fast_string
в мире Джава все не так, там нет никаких лишних аллокаций

:)

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

Страница 128 из 1630