当前位置: 技术问答>linux和unix
对于这样的问题该如何提高其效率?
来源: 互联网 发布时间:2015-07-25
本文导语: 就是接收到一个UDP数据包后,对其中数据进行简单的处理(对数据内容有修改,处理时间不是太长),然后再转发出去(也是UDP方式),但是要求效率能高些,不至于在高峰时期发生丢包现象. 请问如何提高其效率? | ...
就是接收到一个UDP数据包后,对其中数据进行简单的处理(对数据内容有修改,处理时间不是太长),然后再转发出去(也是UDP方式),但是要求效率能高些,不至于在高峰时期发生丢包现象.
请问如何提高其效率?
请问如何提高其效率?
|
Creating two threads and one message queue (for capability you should implement the queue yourself and not make use of SYSTEM V message queue ), one is responsible to receive data and send it into a queue and the other is responsible to receive data from queue and transfer data.
If your system has not enough capability, the data maybe is lost.
If your system has not enough capability, the data maybe is lost.
|
1.用C
2.多进程或者多线程
3.加大缓冲区大小
4.优化程序(代码优化,结构优化等等)
2.多进程或者多线程
3.加大缓冲区大小
4.优化程序(代码优化,结构优化等等)
|
多线程
加大缓冲区
加大缓冲区
|
如果流量真的非常大的话,还是不要单纯依赖这些手段。
自己在UDP上实现一些丢包检测之类的机制吧,就像NFS那样。
性能和稳定性总是矛盾的。
自己在UDP上实现一些丢包检测之类的机制吧,就像NFS那样。
性能和稳定性总是矛盾的。
|
这跟缓冲区有什么关系,一次只能处理一个包
多线程加为速度优化的代码
比如:预分配内存,用C/C++基本数据类型(用char*而不是CString或string),用inline,减少系统调用特别是互斥、信号之类(线程同步可以巧妙设计以避免使用这些奢侈对象)
多线程加为速度优化的代码
比如:预分配内存,用C/C++基本数据类型(用char*而不是CString或string),用inline,减少系统调用特别是互斥、信号之类(线程同步可以巧妙设计以避免使用这些奢侈对象)
|
用队列不会丢包,最多队列越来越长。但是对于实时性要求较高的地方用队列不好,我做的测试发现延时很严重。
在linux下我使用多线程(设为实时)转发和多进程转发在实时性方面竟没有多少区别,不知为啥
还有如果想让多个线程为实时又有同样高的优先级不知道该怎么设置priority的值.
在linux下我使用多线程(设为实时)转发和多进程转发在实时性方面竟没有多少区别,不知为啥
还有如果想让多个线程为实时又有同样高的优先级不知道该怎么设置priority的值.
|
在UDP方式下丢包是绝对的,不丢包只在一些特殊情况下才会发生,譬如你的网络负荷非常低,而且不存在突发的网络传输高峰,如果你需要保证可靠传输,只能采取附加手段
采用多线程和多进程从理论上是完全一样的,基本上不会有性能突破,单线程和多线(进)程的区别是在多线(进)程模式下,你可以采取阻塞读方式,在系统负荷不高的情况下,可以立刻把收到的数据读走,尽量避免丢包
常用的方式是使用两个线程,一个阻塞读,读到数据以后存放到循环缓冲区,另一个线程从循环缓冲区读数据,处理后发送,这样做的主要原因是为了避免接收时丢包,发送线程如果发的太快也会丢包,事实上如果单线程程序设计好了也可以达到同样的效果
采用多线程和多进程从理论上是完全一样的,基本上不会有性能突破,单线程和多线(进)程的区别是在多线(进)程模式下,你可以采取阻塞读方式,在系统负荷不高的情况下,可以立刻把收到的数据读走,尽量避免丢包
常用的方式是使用两个线程,一个阻塞读,读到数据以后存放到循环缓冲区,另一个线程从循环缓冲区读数据,处理后发送,这样做的主要原因是为了避免接收时丢包,发送线程如果发的太快也会丢包,事实上如果单线程程序设计好了也可以达到同样的效果
|
多线程是可以优化的
一个线程负责接收数据,然后将数据发给子线程处理
优化点是创建线程的开销,不要自动结束线程,处理完成后等待下一个任务
调度线程不能等待,因为数据必须被及时接收,否则就会丢失
子线程则不必及时启动,子线程可以定时检查是否已经有了新任务,子线程休眠的时间对于客户来讲是无关紧要的,对于服务器却省去了线程同步的开销
一个线程负责接收数据,然后将数据发给子线程处理
优化点是创建线程的开销,不要自动结束线程,处理完成后等待下一个任务
调度线程不能等待,因为数据必须被及时接收,否则就会丢失
子线程则不必及时启动,子线程可以定时检查是否已经有了新任务,子线程休眠的时间对于客户来讲是无关紧要的,对于服务器却省去了线程同步的开销