Oct 18, 2017 12:49
В процессе использования ssh-over-sctp (замечательная штука, если задуматься), регулярно спотыкался об сообщение в логах ssh - "Message too long". Само собой, в man ssh, man sctp - ничего полезного. В гугле ничего полезного тоже не было, кроме одного сообщения в google groups, наведшего на правильную мысль.
С помощью strace выяснил, что иногда через SSH (я использую его для туннелирования трафика) проходят сообщения длиной в сотни килобайт. Где-то в районе 200кб+, при write в сетевой сокет, ssh получал ошибку EMSGSIZE:
...
10229 write(3, "*******************************"..., 264760) = -1 EMSGSIZE (Message too long)
10229 write(2, "packet_write_poll: Connection to"..., 77) = 77
10229 exit_group(255) = ?
10229 +++ exited with 255 +++
Известно, что SCTP шлёт датаграммы как есть, без разбиения на пакеты (фрагментация есть, но уровнем ниже, её можно отключить принудительно, но это был не мой случай). Мне всегда было интересно, на сколько большие датаграммы можно через него заслать и, видимо, я-таки нашёл ответ (жаль, что на продакшене).
Лимит, в общем, оказался банальным - значение wmem откуда-то из дебрей ядра:
net.core.wmem_default = 212992
net.core.wmem_max = 212992
При попытке отправить датаграмму большего объема, клиент получает EMSGSIZE.
Не уверен, можно ли это исправить на уровне апликации (SCTP отвратительно задокументирован), но на уровне ядра - точно можно. Просто меняем значения wmem_default, wmem_max (мне хватило 4MB) и радуемся.
Вообще, конечно, это больше похоже на недоделку, чем на фичу. Своих настроек предельного размера сообщений у SCTP нету, в стандарте по этому поводу тишина, а датаграммами может захотеть баловаться достаточно большими, благо транспорт к тому располагает. Например, почему б не слать многомегабайтные жипеги одной датаграммой?..
P.S. Пост написан, что б помочь тем, кто ищет решение проблемы в гугле и ничерта не может нагуглить. Если кому-то это помогло (вы нашли это по ключевикам типа ssh, sctp, message too long, emsgsize), сообщите в комментах, мне будет приятно.