有没有大大搞过高性能的 udp 服务器的,遇到个问题,想请教下。 已经调了两天了,方法基本上都已经试过了。本人小弱鸡,谢谢啦~

2017-12-13 21:39:45 +08:00
 qk3z
在不考虑丢包率的状态下,开一个端口服务器最高每秒收包 16w 左右。这个还能有什么方法再提升么?
我开两个线程两个端口收包,就变成一个端口收 10 多万每秒,一个端口收 4、5 万每秒,感觉不对劲额,是不是有什么问题?先谢谢大家指点了。。。

忘了说一点,一个数据包 1.3k 左右,大小固定死了。
5374 次点击
所在节点    Java
27 条回复
defunct9
2017-12-13 22:04:36 +08:00
开 ssh,我上去看看
qk3z
2017-12-13 22:10:28 +08:00
@defunct9 #1 公司内网服务器...
likuku
2017-12-13 22:24:54 +08:00
网卡 /交换机转发率 /CPU 到顶了?
defunct9
2017-12-13 22:27:50 +08:00
程序扔出来看看
hugee
2017-12-13 22:34:21 +08:00
要看具体程序
changnet
2017-12-13 22:35:49 +08:00
一般来说,内网服务器不太可能是因为网络问题,硬件也没变。基本上是你的程序写得有问题,比如你两个线程是不是存在竞争,或者你这个服务器是跑在虚拟机下的,就会这样。
qk3z
2017-12-13 22:51:10 +08:00
@defunct9 #4
@hugee #5 明天放代码给给位看看,谢谢指点


@likuku #3 这个是虚拟机,CPU,网卡应该没到顶...
@changnet #6 是在虚拟机下跑的,准备明天放到物理机上看看有没有提升。要不就是程序写得有问题...
blahgeek
2017-12-13 23:00:51 +08:00
之前在 Cloudflare 的 blog 里看到过,个人觉得写的很清晰

https://blog.cloudflare.com/how-to-receive-a-million-packets/
https://blog.cloudflare.com/kernel-bypass/
blahgeek
2017-12-13 23:02:28 +08:00
其中提到了你遇到的问题:

The receiving performance is down compared to a single threaded program. That's caused by a lock contention on the UDP receive buffer side.
...
Fortunately, there is a workaround recently added to Linux: the SO_REUSEPORT flag
Michaelssss
2017-12-13 23:02:53 +08:00
我小小算了下。。。208MB/S,大概比千兆网络强
changnet
2017-12-13 23:12:45 +08:00
@qk3z 虚拟机开多线程、多进程都是会降性能的。双线程大概只有 1/2,三线程 1/3。这个你 google 一下就知道,无论是 virtualbox 还是 vm 都有这个问题。我之前测自己程序性能时也踩这个坑了。
changnet
2017-12-13 23:54:24 +08:00
@changnet
@qk3z
一激动,貌似搞错了。是给虚拟机加 cpu 核心数量性能才会降得这么厉害,就是设置虚拟的 cpu 数量。多线程貌似没这个问题,不过虚拟机是工作在单线程。多线程反而会降一些性能,但是不会降这么厉害。
wsy2220
2017-12-13 23:57:44 +08:00
测性能别用虚拟机
tempdban
2017-12-14 08:37:05 +08:00
mtcp+dpdk
Panic
2017-12-14 08:50:13 +08:00
绑定进程到特定核试试,cpu 亲和性
watzds
2017-12-14 09:27:58 +08:00
@blahgeek 你说的是开一个端口,两个线程收,需要加锁。这种情况可以加 SO_REUSEPORT。
楼主直接开了两个端口吧
afeicool
2017-12-14 09:37:21 +08:00
好奇实际业务上下文:)
realpg
2017-12-14 09:38:43 +08:00
一般普通服务器 udp 纯发包的服务器 万兆网卡只要程序写的不弱智 不任何优化 最次也能跑大约 2.2Gbps
qk3z
2017-12-14 09:39:06 +08:00
@tempdban #14 使用 java 写的...
@Michaelssss #10 万兆网卡...
qk3z
2017-12-14 09:44:37 +08:00
@afeicool #17 C 那边给发数据包,java 这边接收并统计计算啥的,但是现在这边接收达不到性能要求。
@realpg #18 是 Java 服务器么... 可能我程序也有问题吧 0.0

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/414516

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX