Мы используем систему ARM для запуска нашего приложения. Мы копируем много данных через сеть. Система работает под управлением Ubuntu, созданного из исходников.
Время от времени приложение зависает с низкой пропускной способностью. Посмотрев на вывод tcpdump, мы заметили, что в конечном итоге получатель объявляет действительно маленький размер окна tcp, всего 500-700 байт. Когда мы решаем эту проблему, размер не меняется вообще. Что мы делаем в коде, просто вызываем read_some () в оболочке сокета из boost asio (версия 1.58).
Каждый раз, когда мы получаем одинаковое количество байтов из сокета (равное размеру окна tcp). Мы перепробовали несколько вещей и до сих пор не понимаем, что происходит. Похоже, ядро имеет необычное поведение. Когда это происходит, я вывожу количество байтов, готовых для чтения из сокета, и оно равно нулю. То есть буфер получателя полностью пуст, но объявленный размер все еще очень мал.
Хуже всего то, что мы не знаем, как быстро это воспроизвести. В один день он терпит неудачу довольно хорошо, в другой - вовсе нет. Мы застряли.
Не могли бы вы дать нам идею, на что посмотреть? Можем ли мы как-то отладить ядро, связанное с настройкой окна tcp?