编程杂谈收集

1、udp server,可以简单理解为多线程echo程序。
如果线程为1,则可以接收300k pack/s, 基本没有丢包,
如果线程>1,则有非常高的丢包率,发送10k pack/s,有1.2k pack/s的丢包率(用sar观察到的)。

2、udp多线程,线程里收没什么问题的,不要多线程同时去收,你可以用一个主线程收取,处理分发给下面逻辑线程,如果你是作为服务器端,对于连接过来的客户端IP管理好就可以了。为什么多程程发送会丢包,没有加锁保护乱了,内核不管你是UDP还是TCP对每个fd都只有一个缓冲区,你想一下,几个线程在发没有加锁向同一块内存狂发会不乱吗?fd里的缓冲早就全乱了。如果你硬要用多线程,就要自己为某个客户端IP/端口映射一个缓冲啊,加上一些锁保护就不会乱了,效率也不会差。

3、我认为多线程写同一个sockfd应该是没问题的。lseek+read/write多线程读写同一个fd有问题,而pwrite/pread多线程读写同一个fd却没问题。
同理,recvfrom/sendto是无须lseek的,和pwrite/pread类似,我认为在多线程环境中是没问题的。

4、加锁应该是不必要的,对比pwrite/pread可知。
我简单查看过内核代码,内核对buffer/queue是有保护的。

5、注意socket层的send和sendto发送接口要判断返回值,send和sendto一次并不能把你想要的一次发送完。
  如果一个线程send的时候没有发送完,有切换到另一个线程在发送,你认为buf里的数据还没有乱吗?

 

你可能感兴趣的:(编程杂谈收集)