- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 C 程序使用 sendto() 方法尽可能快地从发送方向接收方发送数据,接收方使用 recvfrom() 方法接收数据。数据被封装到第 2 层以太网帧中,应用程序将以太网帧直接写入线路(没有 TCP 或 UDP 甚至 IP)。这是在 x86_64 Linux 上(开发机器只是股票 Ubuntu 14.04)。我无意移植到任何其他操作系统,应用程序设计范围是针对 Linux 的,因此其他操作系统无关紧要。
发件人:
while (true)
{
sendResult = sendto(sockFD, txBuffer, fSize+headersLength, 0,
(struct sockaddr*)&socket_address, sizeof socket_address);
}
接收方:
while (true)
{
recvfrom(sockFD, rxBuffer, fSizeTotal, 0, NULL, NULL);
}
我希望发件人能够检查收到的数据包;如果接收方应用程序退出,它会将数据发送回发送方说“我退出”,以便发送方停止发送数据。我在发件人上使用 poll() 来检查收到的消息,如下所示,但这显着降低了传输速度,从略低于 1Gbps (968Mbps) 到大约 10Mbps。我正在使用两台具有 1Gbps NIC 的 PC 之间的交叉电缆进行测试。发送方对发送的帧和帧大小进行计数,接收方对接收到的帧和帧大小进行计数,因此为了确认,应用程序实际上以足够接近的线速接收,我不只是看 NIC 利用率或类似情况。
轮询() 方法:
int rv;
struct pollfd ufds[1];
ufds[0].fd = sockFD;
ufds[0].events = POLLIN
while (true)
{
sendResult = sendto(sockFD, txBuffer, fSize+headersLength, 0, (struct sockaddr*)&socket_address, sizeof(socket_address));
// wait for events on the sockets, 1ms timeout
rv = poll(ufds, 1, 1);
if (rv > 0) {
if (ufds[0].revents & POLLIN) {
recvfrom(sockFD, rxBuffer, fSizeTotal, 0, NULL, NULL);
}
}
}
1 毫秒是可以为 poll() 方法设置的最短超时时间。这就是为什么我的传输程序只能以 10Mbps 传输。该应用程序可以轻松地使 1Gbps 的链接饱和,尽管 CPU 使用率极低,正如我之前所说的那样,我获得了 968Mbps(顺便说一下,我不是指峰值,这是持续的吞吐量)。
我删除了 poll() 调用并使用下面的示例切换到 select(),但再次使用我可以在这里使用的最小延迟,我的传输应用程序只能获得 175Mbps。不接近原来的968Mbps;
Select() 方法:
fd_set readfds;
struct timeval tv;
int rv, n;
FD_ZERO(&readfds);
FD_SET(sockFD, &readfds);
n = sockFD + 1;
while (true)
{
sendResult = sendto(sockFD, txBuffer, fSize+headersLength, 0, (struct sockaddr*)&socket_address, sizeof(socket_address));
tv.tv_sec = 0;
tv.tv_usec = 000001;
rv = select(n, &readfds, NULL, NULL, &tv);
if (rv > 0) {
if (FD_ISSET(sockFD, &readfds)) {
recvfrom(sockFD, rxBuffer, fSizeTotal, 0, NULL, NULL);
}
}
对于今天的系统来说,这两种方法似乎都太慢了(对于上述所有测试,我的 CPU 使用率约为 2%)。我希望尽快将此应用程序移动到一些 10GigE 机器上并在那里开始测试,但我显然不能使用这两种方法中的任何一种。有没有更快的方法可以检查?
虽然这些应该是非阻塞的,但是通过要求超时它们在某种程度上是阻塞的;我看过this thread但这不是我需要的答案。有没有我可以简单地调用它的方法来检查它被调用的那一刻,等待读取的数据,然后如果没有数据等待读取则立即返回?
作为辅助节点,在发布此之前我还没有阅读 recvfrom 方法()以查看延迟在哪里,但我确实尝试了以下方法,因为更改代码只花了 30 秒,结果是低于 1Mbps 的最差结果;
发件人:
while (true)
{
// Continually send a frame then check for a frame, send a frame then check for a frame...
sendResult = sendto(sockFD, txBuffer, fSize+headersLength, 0, (struct sockaddr*)&socket_address, sizeof(socket_address));
recvfrom(sockFD, rxBuffer, fSizeTotal, 0, NULL, NULL);
}
最佳答案
我根本不会使用非阻塞模式。只需在阻塞模式下专用一个线程。这样一来,您只需执行一个系统调用:recvfrom()
,这样您就可以将上下文切换保存到内核中。
关于c - 有没有比 select() 和 poll() 更快的非阻塞方法来检查数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23922842/
我原以为 epoll 应该比 poll 快,但是当我做下面的实验时,结果发现它更慢。 首先,我设置了 1 个连接了 10 个客户端套接字的服务器套接字。 import socket server =
当我尝试在代码编辑器中粘贴时他剪掉了我的标签。它不允许它..我不明白,我什么都试过了。 有人可以帮助我.. 给我> extended_valid_elements: 'poll[poll-id
我无法唤醒被 poll.poll() 函数阻塞的线程。有人可以帮我吗? 最佳答案 处理这个问题的方法是在传递给 poll() 的描述符列表中包含一个额外的文件描述符。对于该描述符,等待读取准备就绪。让
在下面的 poll() 方法中,我的 IDE 提示它返回 JobSet。工具提示显示: my.package.JobSetQueue 中的 poll() 与 java.util.concurrent.
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
在每个 youtube 教程中,我都看到人们只是将“app_name”添加到 INSTALLED_APPS 列表中。 昨天我开始了官方 Django 教程,他们建议使用“app_name.apps.A
我正在查看 LinkedList 中的 poll() 和 unlinkFirst() 代码,但我似乎找不到如何实现如果 LinkedList 中存在 null 项,它可以防止返回 null。 poll
为什么当我尝试轮询时,我在 ajax 中看到此错误消息“(!)注意: undefined index :在 D:\wamp\www\poll\poll.php 第 6 行中进行轮询”。我有两个文件 1
我使用 python 的 cProfile 模块分析了我的 python 代码并得到了以下结果: ncalls tottime percall cumtime percall filen
我尝试通过 websocket 和轮询运行我的 socket.io 程序,它们都有效。但是,当尝试运行 xhr-polling 时,它会超时。这可能是什么原因造成的? 对于这个程序,我使用的是 soc
我正在实现自己的自定义组件,我发现我需要为消费者提供两个用例: 第一个尝试经常获取 N 条可用消息(轮询消费者) 第二个是订阅者消费者,它会在消息可用时获取消息。 我的主要问题是是否可以实现这两种类型
测试环境:Ubuntu 12.04描述:我做了以下 # `sudo truncate -s 0 /var/log/syslog` # logger "helloworld". # `cat /var/
我正在使用(很棒的)mrjob Yelp 的库在 Amazon 的 Elastic Map Reduce 中运行我的 python 程序。它依赖于标准 python 库中的子进程。在我运行 pytho
这直接来自民意调查教程,我是编程新手,正在学习 Python 和 Django,这对我来说看起来很陌生。这是 JavaScript 吗?我还需要学习什么语言才能学习 Django 吗? 民意调查/模板
我试图了解在 kafka 消费者中处理需要更长时间处理的记录的更好选择是什么?我进行了一些测试来理解这一点,并观察到我们可以通过修改 max.poll.records 来控制这一点。或 max.pol
我正在尝试创建我的 Django 项目/网站的“投票”部分,教程 (https://docs.djangoproject.com/en/1.8/intro/tutorial01/) 说在我们“激活”模
我有一个应用程序,其工作原理如下:Linux 机器生成 28 种不同类型的给客户的信件。信件必须以 .docx(Microsoft Word 格式)发送。秘书维护 MS Word 模板,必要时会自动使
我目前正在尝试让 FileSystemWatcher 工作,如 this question 中所述.在我的研究过程中,我在这个网站上发现了很多描述这个类(class)不可靠的答案和评论。相反,在某些地
我正在寻找 kafka 来实现低延迟消息队列,并且我一直在阅读有关消费者长轮询的信息。但是,没有关于如何实际使用长轮询或需要设置哪些选项才能启用它的示例。如何使用 kafka java api 启用长
用户首次登录时的通知,没那么难,只需要扫描数据库,我可以处理。然而,当 friend 在个人资料 X 上发送请求或评论时,会发送通知,并且几乎立即在另一端收到通知,即使用户 X 没有提出任何请求。是投
我是一名优秀的程序员,十分优秀!