poll()是否预计需要40ms才能返回,即使数据会更快可用
Is it expected for poll() to take 40ms to return even though data will be available sooner?
我创建了一个代理服务器来处理来自网站客户端的CQL订单。代理侦听传入的连接,每个连接都有一个线程。只要套接字存在,线程就会循环,并在HUP
上终止。您也可以停止代理,它将通过向每个线程发送一个事件(请参阅eventfd())来停止线程。
就其本身而言,这已经让我节省了100毫秒的时间,因为代理是本地的,连接到本地服务比远程计算机上的服务快得多。。。(即使计算机是本地的。)
但是,我发送订单,代理偶尔看不到任何传入数据(即,它在设置为NONBLOCK
的套接字上调用read()
,并得到-1作为返回和errno == EAGAIN
。)当这种情况发生时,我调用poll()
以等待其他数据、HUP
或eventfd
上的命中,这意味着我必须退出(即,2个fds、套接字和eventfd
)。
不知何故,通常情况下,当我调用poll()
函数时,它会使消息往返所需的时间增加40毫秒。虽然有人会认为这只会发生在较大的消息上,但当我收到小于100字节的订单时,就会发生这种情况!因此,尺寸不应该是罪魁祸首。我还更改了代码,以确保在一个write()
中将整个订单从客户端发送到代理,并尽可能避免poll()
(即,我首先调用read()
,只有在没有可用的情况下才调用poll()
)
请注意,在这种情况下,我没有超时,因为除了传入订单和eventfd
之外,没有什么可检查的。所以我想超时不会是个问题。
代码库真的很大。但是客户端/服务器可以归结为这样的东西(原始文件中的大小是完全动态的):
// Client
...
connect(socket);
...
write(socket, order, sizeof(order));
read(socket, result, sizeof(result));
// repeat for other orders, as required by client...
// server
...
socket = accept(); // happens for each client
...
pthread_create(runner);
...
// server thread (runner)
...
for(;;)
{
int r(0);
for(;;)
{
r += read(socket, order, sizeof(order));
if(r >= sizeof(order))
{
break;
}
// wait for more data is not enough received yet
poll(..."socket" + "eventfd"...); // <-- this will often take 40ms
if(eventfd_happened)
{
// quit thread
return;
}
}
...
[work on order]
...
write(socket, result, sizeof(result));
}
注1:当我只有一个客户时,我会发现问题。因此,拥有多个客户端本身也不会造成问题。
注意2:客户端确实使用了[来自OpenSSL]的BIO_connect()、BIO_read()和BIO_write(),但我怀疑这会是个问题。我不使用任何类型的加密。
我不明白为什么要使用非阻塞I/O,因为每个套接字都有一个专用线程。只需在read()
中阻塞。如果需要整体读取超时,请使用SO_RCVTIMEO
。
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- 从函数返回任意简单类型的数据
- 通过 NIF 从C++返回自定义数据结构
- 为什么我们使用在C++中返回数据结构的函数?
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 如何在模板中返回正确类型的数据?
- H5Tget_member_type() 返回复合 HDF5 数据类型的奇怪值
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数
- 在C++中,运算符 sizeof 返回什么数据类型?
- 函数重载并根据相同的输入返回不同的数据类型
- 从新实例的向量中检索数据返回 0
- 类类型中的访问器函数未从 C++ 中的私有数据返回正确的值
- c++ 函数,将数据返回到引用向量
- UNIX域套接字C++服务器无法将数据返回到客户端
- 获取和设置内部数据:返回类型,错误情况下的行为
- 存储在char数组中的双精度数据返回浮点值
- QtCreator QMediaPlayer元数据返回空白QString
- 直接使用变量(数组中的数据返回相同)或与指针一起使用