|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
java比较简单,没有C++的烦琐,但学习时最好有C++为基础.与JSP和SQL起应用,功能强大.比来恰好完成了一个DNS服务器的开辟,因而堆集一点对高功能UDP服务器的开辟履历。假如你也碰到UDP服务器的功能欠安,远不如你的预期,大概你也能够接纳本文的手腕往优化一下尝尝。
udp不像tcp是有毗连的,因而udp不克不及经由过程创建多个毗连来进步对服务器的并发会见,然后我就碰到了在多核情况下经由过程多线程会见一个共享的udpsocket时,不管怎样我都没法将一切的cpu都使用起来,最初的了局固然就是没法压测出呆板的瓶颈,功能也上不往。Google为懂得决他们的DNS服务器功能成绩,就给linux内核打了一个patch,这个patch就是SO_REUSEPORT,经由我的实战体验,reuseport对udp服务器在多核呆板上的功能提拔长短常年夜的,值得利用。
REUSEPORT的目标如其名,就是为了让多线程/多历程服务器的每一个线程都listen统一个端口,而且终极每一个线程具有一个自力的socket,而不是一切线程都会见一个socket。没有reuseport这个patch的话,这么做的成果就是服务器会报出一个相似“地点/端口被占用的”毛病信息。在没有reuseport的时分,客户端发给udp服务器的每一个包都是被送达到独一的一个socket上了,利用reuseport后,服务器有了多个socket,那末客户端发过去的包送达到哪一个socket上呢?linux内核接纳了一个四元组<客户端ip,客户端port,服务器ip,服务器port>的hash来举行包的分发,如许做最少有两个目标:一是包管统一个客户渡过来的包都被递送到统一个socket上;二是在客户端量充足的时分,基础能够平衡到一切的socket上。在利用reuseport的时分必要注重:客户端太少的话,是很难压测出服务器的实在功能的,由于reuseport利用的是hash值来分发哀求到socket上,以是大概呈现每一个socket上吸收包不平衡的情形,利用较多的客户端呆板来压测服务器,目标就是让每一个socket尽量的平衡。
利用reuseport后,udp服务器的并发才能年夜幅度的进步了,这个时分还能够持续利用recvmmsg来持续下降体系挪用的开支。recvmmsg是一个批量接口,它能够从socket里一次读出多个udp数据包,不像recvfrom那样一次只能读一个。假如客户端多、哀求量年夜的话,recvmmsg的批量读就很有上风了。不外,利用recvmmsg必定要分明,它从socket里一次读出的一切包纷歧定是来自统一个客户真个,年夜多半情形应当都是来自分歧客户真个。这不像tcp,从统一个毗连里读到的数据必定是统一个客户端。我们的一个同砚在利用recvmmsg的时分,就犯了这个毛病,误以为一次收取的数据包都是统一个客户真个,最初将一切的应对都发给了统一个客户端,其他的客户端全都超时了。高功能服务器开辟中,体系挪用是高贵的,以是没事就能够用strace看看一个哀求周期内有哪些体系挪用,尽统统大概往优化失落他们。
开辟一个UDP服务器,不是说利用了reuseport和recvmmsg后功能就高了。一个高功能的收集服务器,是必要举行各个方面的优化才行的。
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。 |
|