У меня проблема с сетью, когда одна машина сообщает, что отправляет данные со скоростью 150 Мбит / с, а другая машина получает всего 100 Мбит / с. Отправляющее приложение в конечном итоге аварийно завершает работу, жалуясь на нехватку памяти (на самом деле это пользовательский dsp, поэтому нет смысла попадать в сообщения об ошибках).
Поэтому я подозреваю, что принимающая машина не обрабатывает загрузку должным образом, но у меня нет большого опыта в отладке таких ситуаций.
Я бегал vmstat
но я понятия не имею, тревожит какое-то из чисел или нет:
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 13317200 262808 2311648 0 0 0 0 1131 3403 4 1 96 0 0
0 0 0 13309140 262808 2311652 0 0 0 9 2092 9235 10 2 89 0 0
0 0 0 13295748 262808 2311652 0 0 0 0 4521 22710 14 4 82 0 0
5 0 0 13279620 262808 2311652 0 0 0 0 13835 66325 30 10 60 0 0
6 0 0 13257432 262808 2311656 0 0 0 0 20092 92365 43 14 43 0 0
3 0 0 13232756 262808 2311660 0 0 0 0 22522 117367 49 17 34 0 0
3 0 0 13207832 262808 2311664 0 0 0 10 23419 149649 54 20 26 0 0
7 0 0 13159720 262808 2311668 0 0 0 8 23816 168436 56 21 23 0 0
8 0 0 13122148 262808 2311668 0 0 0 0 26267 168578 54 20 26 0 0
8 0 0 13119544 262808 2311668 0 0 0 0 30498 164004 53 24 24 0 0
7 0 0 13117312 262808 2311668 0 0 0 0 29853 163340 55 23 23 0 0
8 0 0 13116832 262808 2311664 0 0 0 3 29942 162609 55 22 24 0 0
8 0 0 13118824 262808 2311668 0 0 0 0 30098 162232 55 21 24 0 0
8 0 0 13118212 262808 2311668 0 0 0 0 29213 159902 45 18 37 0 0
8 0 0 13116352 262808 2311668 0 0 0 3 29552 161978 55 21 24 0 0
7 0 0 13117468 262808 2311664 0 0 0 9 30218 162704 56 22 22 0 0
5 0 0 13116972 262808 2311672 0 0 0 0 30172 164399 57 19 24 0 0
8 0 0 13115608 262808 2311672 0 0 0 8 30068 163894 56 18 26 0 0
0 0 0 13181080 262808 2311676 0 0 0 0 19062 151066 46 20 34 0 0
6 0 0 13186536 262808 2311676 0 0 0 0 6812 85690 15 19 66 0 0
1 0 0 13186784 262808 2311676 0 0 0 0 6733 82150 19 22 59 0 0
0 0 0 13203400 262808 2311716 0 0 0 9 2659 33015 5 5 90 0 0
Я также проверил sockstat
, но я не знаю, беспокоят ли эти цифры:
> cat /proc/net/sockstat
sockets: used 920
TCP: inuse 82 orphan 0 tw 0 alloc 91 mem 8228
UDP: inuse 271 mem 20
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
Вот буферная память TCP (я попытался установить для них значения, которые видел на другом компьютере в лаборатории, где они были примерно утроены без изменений):
> sysctl -a | grep tcp.*mem
net.ipv4.tcp_mem = 69888 93184 139776
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
Что касается оборудования, то у меня его 8 ядер:
> cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Xeon(R) CPU E5472 @ 3.00GHz
stepping : 10
cpu MHz : 2403.000
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
bogomips : 5999.77
clflush size : 64
cache_alignment : 64
address sizes : 38 bits physical, 48 bits virtual
Какие еще утилиты я могу использовать для отладки этого? И если у кого-то есть хорошие ресурсы для такой отладки, я был бы признателен!
Я предполагаю, что у отправителя есть сетевая карта 1 Гбит и что отправляемый им трафик не является TCP, иначе он никогда не будет идти быстрее, чем может получить получатель. «Лучшее» решение, вероятно, состоит в том, чтобы заставить приложение получать некоторые подтверждения, которые оно не отправляет слишком быстро, но вы также можете проверить, действительно ли получатель работает на 100 Мбит вместо 1 Гбит. Вы также можете посмотреть netstat -i
в обеих системах, чтобы увидеть, есть ли у вас ошибки или падения.
РЕДАКТИРОВАТЬ: Основываясь на вашем комментарии, я бы предположил, что либо TCP не работает должным образом (что имеет смысл, если ваше приложение утекает память, почти наверняка есть ошибка), либо ваши инструменты измерения неточны. Что вы используете для измерения своего трафика? Вы можете запустить netstat -i -c
для непрерывного обновления (раз в секунду), чтобы видеть, что система думает, что они отправляют и получают.
Что это показывает? sudo sysctl -a | grep tcp.*mem
Также: sudo ethtool ethWhateverYoursIs
Я предполагаю, что каким-то образом отправляющее приложение не соблюдает управление потоком TCP и в конечном итоге исчерпывает буферную память отправки TCP и дает сбой.