大家好,前几天我写了一个程序,需要在两台电脑之间用 UDP 传数据。这两个电脑中有一台充当 server ,有一台充当 client , client 的工作是一直往 server 发数据(尺寸不是很大),同时每隔半秒钟还发一个“心跳包”。我在 server 上做了一个设置,就是如果 2 秒内没有收到任何心跳包,就认为 client 不在线了,然后就退出。
这样的设置,我在家里的 WiFi 测试没有问题,但是在真正使用时就出了问题。
这个真正使用的环境是在一个大概面积 100 平米的房间里举行的一场晚会, client 与 server 就连接到这个房间里的同一个 WiFi 上。晚会开始之前有排练,在排练的时候,房间里有大概有十来个人,那时这个程序还能正常工作,但有时好像会偶尔丢一两个包。但是等后来房间里的人多到快 100 个的时候, WiFi 的性能好像就明显下降,我甚至没法在 client 机器上 ping 到 server 机器;而这个程序在一次侥幸连接上并运行之后正常工作了大概十秒钟,就因为在接下来的 2 秒钟内没有收到心跳包而不能正常工作了。
因为当时我不知道有 iperf 之类的工具,所以我也不知道丢包率之类的信息。因为没有事故现场的记录,所以我现在也不是很清楚当时为什么会出现 2 秒内的 4 个心跳包全没收到的情况。后来为了查明原因并让程序更稳定一点,我就用了 tc 手工增加延时(到 10 秒)和丢包率(到 25%),在此种环境下将程序的 2 秒超时改成了 20 秒,并且改正了一些同步时的处理流程(简单说就是如果有很多包一起送来,只取最新的,然后计算 delta )。但是我还是不知道是否用 tc 模拟一下延时和丢包率是否真的能重现当时的恶劣的 WiFi 下的情况(因为网上还有人说延时能多至 40 秒的),以及这样的应对措施是不是够了。
后来有一次回到了同一个房间,那时房间里只有 3 个人,这个程序又完美工作了。所以我想肯定是只有在那个房间里人多的时候才有问题。
这个问题弄砸了晚会上的一个表演,程序当众出问题,好尴尬,要哭死了 :(((((
这样的设置,我在家里的 WiFi 测试没有问题,但是在真正使用时就出了问题。
这个真正使用的环境是在一个大概面积 100 平米的房间里举行的一场晚会, client 与 server 就连接到这个房间里的同一个 WiFi 上。晚会开始之前有排练,在排练的时候,房间里有大概有十来个人,那时这个程序还能正常工作,但有时好像会偶尔丢一两个包。但是等后来房间里的人多到快 100 个的时候, WiFi 的性能好像就明显下降,我甚至没法在 client 机器上 ping 到 server 机器;而这个程序在一次侥幸连接上并运行之后正常工作了大概十秒钟,就因为在接下来的 2 秒钟内没有收到心跳包而不能正常工作了。
因为当时我不知道有 iperf 之类的工具,所以我也不知道丢包率之类的信息。因为没有事故现场的记录,所以我现在也不是很清楚当时为什么会出现 2 秒内的 4 个心跳包全没收到的情况。后来为了查明原因并让程序更稳定一点,我就用了 tc 手工增加延时(到 10 秒)和丢包率(到 25%),在此种环境下将程序的 2 秒超时改成了 20 秒,并且改正了一些同步时的处理流程(简单说就是如果有很多包一起送来,只取最新的,然后计算 delta )。但是我还是不知道是否用 tc 模拟一下延时和丢包率是否真的能重现当时的恶劣的 WiFi 下的情况(因为网上还有人说延时能多至 40 秒的),以及这样的应对措施是不是够了。
后来有一次回到了同一个房间,那时房间里只有 3 个人,这个程序又完美工作了。所以我想肯定是只有在那个房间里人多的时候才有问题。
这个问题弄砸了晚会上的一个表演,程序当众出问题,好尴尬,要哭死了 :(((((
