当前位置: 首页 > 面试题库 >

C ++套接字服务器-无法使CPU饱和

伯博
2023-03-14
问题内容

我已经使用boost :: asio用C
++开发了一个微型HTTP服务器,现在我正在使用多个客户端对其进行负载测试,但是我一直无法接近饱和的CPU。我正在Amazon
EC2实例上进行测试,一个CPU的使用率约为50%,另一个CPU的使用率为20%,其余两个则处于闲置状态(根据htop)。

细节:

  • 服务器为每个内核启动一个线程
  • 接收,解析,处理请求,并写出响应
  • 请求是针对从内存中读取的数据(此测试为只读)
  • 我正在使用两台计算机“加载”服务器,每台计算机运行一个Java应用程序,运行25个线程,发送请求
  • 我看到大约230个请求/秒的吞吐量(这是 应用程序 请求,由许多HTTP请求组成)

那么,我应该怎样看才能改善这个结果?鉴于CPU大部分处于空闲状态,我想利用这些额外的容量来获得更高的吞吐量,例如800个请求/秒或其他。

我的想法:

  • 这些请求很小,通常在几毫秒内就可以完成,我可以修改客户端以发送/编写更大的请求(也许使用批处理)
  • 我可以修改HTTP服务器以使用“选择”设计模式,这是否合适?
  • 我可以做一些剖析,以尝试了解瓶颈所在

问题答案:

boost :: asio不如您希望的那样友好线程-boost / asio / detail /
epoll_reactor.hpp中的epoll代码有很大的锁,这意味着一次只能有一个线程可以调用内核的epoll syscall
。对于很小的请求,这将带来所有不同(意味着您将仅看到单线程性能)。

请注意,这是boost :: asio使用Linux内核工具的方式的限制,不一定是Linux内核本身。使用边缘触发的事件时,epoll
syscall确实支持多个线程,但是正确处理(没有过多的锁定)可能会非常棘手。

顺便说一句,我一直在这方面做一些工作(将完全多线程的边缘触发epoll事件循环与用户预定的线程/光纤相结合),并在nginetd项目下提供了一些代码。



 类似资料:
  • 我编写了一个简单的java套接字服务器。我可以使用java客户端连接到它。 但是,当我尝试将android设备连接到它时,它会给出以下错误: 代码如下: 这一行:似乎是罪魁祸首。 错误消息“java.net.socketexception:套接字失败:EACCES(权限被拒绝)” Android java.net.SocketException:套接字失败:EACCES(拒绝权限) Android

  • 我们收到了这段代码,应该对其进行修改,以便无论何时客户端连接到服务器并发送消息,服务器都应该回复我听到了,伙计。这适用于一个或多个客户机,但下一个任务是,当新客户机连接时,服务器应该告诉所有其他已连接的客户机。 我以为这会很容易,但结果并不像我想象的那样。由于服务器总是得到sock 3,第一个客户端得到4,第二个客户端得到5等等,所以我尝试创建一个for循环,每当一个新客户端连接时,该循环就会向4

  • 线程“main”java.net.ConnectException:连接超时:在java.net.dualStackplainsockeTimpl.Connect0(本机方法)在java.net.dualStackplainsockeTimpl.socketConnect(DualStackplainsockeTimpl.java:69)在java.net.abstractplainsockeTi

  • 真的需要你帮忙。 我的项目是通过电缆连接两台PC机,并使用tcp套接字将客户端文本框形式的字符串发送到服务器。问题是ATI只能发送一个字符串,然后连接就会关闭。 注意:某个端口上的连接将在表单加载中建立并成功。

  • 我正在开发web套接字应用程序。从前端来看,每个应用程序都有一个插座。但我不确定后端。我们将Python和nginx与Flask socketIO和socket io客户端库一起使用。此体系结构将用于通知前端发生了更改,并应更新数据。 以下是我的疑问-服务器上将创建多少套接字和线程?不同连接之间是否可以共享套接字?是否有任何工具可以分析插座是否打开?

  • 问题内容: 上传或提交页面时,我的网站上出现以下错误: mysql_real_escape_string()[function.mysql-real-escape- string]:无法通过套接字’/var/lib/mysql/mysql.sock’连接到本地MySQL服务器(2) 这到底是什么意思? 问题答案: 由于对该错误的调用引发了错误,因此它意味着您没有先调用该错误并将有效的数据库句柄传递