基本服务器占用大量CPU资源-如何减轻

Basic server taking up massive CPU resources- how to alleviate?

本文关键字:资源 CPU 何减轻 服务器      更新时间:2023-10-16

我正在用C++编写一个非常基本的服务器。

我最终得到了一个类似的架构:

一个线程(服务器)在accept()上不断循环,等待连接(文档)。

它发现的每一个连接都会产生一个线程,该线程在recv()上循环等待读取内容,而send()则发送队列中的任何内容(recv-docs)(send-docs)。

然而,我希望能够(从外部线程)告诉服务器或单个连接本质上是自杀。问题是accept()recv()都会阻塞,直到它们找到任何活动为止,所以它们无法检查其should_kill_self成员是否已设置或其他什么。为了解决这个问题,我在文件描述符上调用了fcntl(sock_fd, F_SETFL, O_NONBLOCK),这样它们就不会了。

通过这种方式,我让服务器不断地在accept()上循环并检查should_kill_self,并且我让每个连接在recv()上循环,检查队列中是否有任何内容到达send(),以及检查should_kill_self

因此,通过这种方式,我可以随时向他们发出自杀的信号,但我注意到的一个副作用是,他们占用了大量的处理时间。我想知道,在这种设置下,我是否在做一些愚蠢的事情,导致冗余计算。我根本不需要它是一个超低延迟的服务器,那么通过在每个循环之间睡10秒来缓解这种情况的"正确"方法是吗?

我刚开始写网络代码,所以我很确定我只是在做一些愚蠢的事情。如有任何建议,我们将不胜感激!

您可能需要探索Linux中的非阻塞IO或windows上的IO完成端口。看看这里和这里。

编写这些程序需要额外的努力,而且比编写简单的套接字服务器稍微困难一些。但是,有些库将封装非阻塞IO(和IOCP),并为您提供一个简单的使用接口。一个例子是升压中的ASIO。还有许多其他库,甚至用于Java和其他语言。