日期:2014-05-16  浏览次数:20714 次

有关 Linux UPD服务器的压力测试问题
各位大侠,知道的请给小弟个建议。

我想做个局域网的UPD服务器的压力测试,要求如下:

1,要尽可能地快速发包,越快越好,尽量能达到1.5W到3W包/秒,并且做到发包是速度是均匀,可控的,也就是说可以知道每 隔 T ms发一个包或是发一次包。

2,发送与接收端分开,发的只管发,接收的只管接收

我的思路:

1,先创建一个socket,bind 一个端口
2,fork,使用双进程,父进程负责发送,子进程负责接收(做到收发分开,但是这样是不是属于并发呢?)

3,发送部分使用多线程,用for循环来创建线程,因为想同步并发,所以没有加锁(不知道这样是不是线程池?没有互斥锁,会产生什么问题?)
  每隔 T ms 发一个包

4,接收部分使用while循环,如果接收就打印接收信息,否则等待(可是多包的时候就出现丢包现象,应该如何解决呢?)

我的问题是:

1,我在发送部分把 usleep(T)去掉,按理说我所发的包应该是在同一个时间内发完的,可是每个包发出去的时间相隔太大,怎么会这样?如何才能将发包的速度提上去?

2,看到有些资料说用2个socket,一个发送,一个用于接收,请问如何使用多个socket?可以用一个端口portA发送,用端口portB来接收么?如果可以请问应该如何设置?

3,我原本想在发送部分再fork个进程来创建线程,实现多进程创建多线程,可是我创建了4个进程(先每个进程创建一条线程,每条线程发1包),只有2个包被发出去,查看时的确是有4个进程出现,不知道是什么原因?

------解决方案--------------------
用开源的工具iperf.
------解决方案--------------------
多个线程同时写入一个socket,会不会有冲突?

这个压力测试可以用多个不相关的进程来实现吧,就写一个单线程的程序,同时启动多份就可以了吧
------解决方案--------------------
不用复制多份,一份程序,启动多次就完了

程序中不要绑定端口,这样每个程序使用的本地端口都是不一样的
------解决方案--------------------
多看高手写的代码,自然编程能力提升了。
------解决方案--------------------
是需要多个进程之间均匀吗?还是一个进程自己均匀
如果是后者,那就加入usleep()
如果是前者,还比较麻烦
------解决方案--------------------
应该是usleep 时间不精确吧

看看这篇文章关于短延迟 sleep usleep nanosleep select

“由此可以得出如下结论,在 linux 2.4 下:
1、支持 usleep,nanosleep,select
2、select 的 精确度为 10毫秒。在10毫秒以上很精确
3、usleep, nanosleep 很不精确

------解决方案--------------------
探讨

多个线程同时写入一个socket,会不会有冲突?

这个压力测试可以用多个不相关的进程来实现吧,就写一个单线程的程序,同时启动多份就可以了吧