# #go #network-programming
Вопрос:
Можно ли использовать общую разгрузку сегментации Linux (GSO)?
Ответ №1:
Да и Нет
GSO устанавливается в ядре, в частности в Сетевом драйвере. В этой статье рассматривается конкретика. Включение GSO обычно выполняется с помощью ethtool
утилиты в Linux:
ethtool --offload eth0 gso on
Поэтому, если предположить, что это задано, то это повлияет на весь трафик, проходящий через интерфейс, включая тот, который генерируется приложением Go.
Это было бы сложнее, но также можно использовать программу go для включения GSO через протокол ethtool. Вероятно, вы можете найти пакет ethtool go для этого.
Обновить
Как вы указали, вы можете оптимизировать GSO (после включения его в соответствии с приведенной выше информацией) еще больше, установив параметры сокета размера сегмента. Из блога cloudflare, которым вы поделились, показано, как это сделать на C:
setsockopt(fd, SOL_UDP, UDP_SEGMENT, amp;gso_size, sizeof(gso_size)))
Под капотом это делается с помощью операционной системы Syscall.
Я предполагаю, что вы используете go-quic
as QUIC, на который ссылается блог Cloudflare. go-quic
можно взять готовую сетку.PacketConn, поэтому вам нужно будет создать его с нуля и добавить опцию сокета сегментации:
s, err := syscall.Socket(...)
if err != nil {
// error handling
}
if err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.UDP_SEGMENT, gso_size); err != nil {
syscall.Close(s)
// error handling
}
if err := syscall.Bind(s, ...); err != nil {
syscall.Close(s)
// error handling
}
if err := syscall.Listen(s, ...); err != nil { // or syscall.Connect
syscall.Close(s)
// error handling
}
f := os.File(s, ...)
ln, err := net.FileLitsener(f) // or net.FileConn, net.FilePacketConn
//ln can now be used by go-quic
Примечание: gso_size-это int, и его необходимо знать заранее
Комментарии:
1. Согласно blog.cloudflare.com/… требуются дополнительные параметры сокета/дополнительные данные.