问题标签 [kqueue]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
libevent - 如何让 libwebsockets 在内部使用 kqueue() 系统调用而不是 _poll()?
到目前为止:1-我有一个使用 libwebsocket 服务器与浏览器(websockets 客户端)通信的本机应用程序。2- 当应用程序连接到 websockets 客户端时,我看到 CPU 使用率很高(活动监视器指示 4 核 mac 机器 - Yosemite(10.10.4) 中的 100% 使用率),我们看到函数 _poll() 正在使用75% CPU:使用 Time Profiler 应用程序看到。3-因此,我将libwebsockets配置为使用libev,希望libev在内部使用kqueue,从而降低cpu利用率[按照此链接中提到的步骤:https ://github.com/warmcat/libwebsockets/blob/e800db52bd0b42285b56d32a20f6d0d142571a89/changelog向下滚动到 v1.3-chrome37-firefox30 -> 用户 api 添加]
但仍然:我看到 libwebsockets 正在使用 _poll() 函数。
如果我错过了什么,谁能告诉我。我的最终目标是看到 libwebsockets 工作 - 在内部使用 kqueue 并检查它是否会降低 CPU 利用率。
macos - kqueue 的 EV_RECEIPT 到底是干什么用的?
kqueue 机制有一个事件标志,根据EV_RECEIPT
链接的手册页:
... 对于在不耗尽任何未决事件的情况下对 kqueue 进行批量更改很有用。当作为输入传递时,它强制
EV_ERROR
总是被返回。成功添加过滤器后,数据字段将为零。
然而,我的理解是,在不耗尽任何未决事件的情况下对 kqueue 进行批量更改是微不足道的,只需将nevents
参数传递给 0kevent
并因此从队列中不提取任何事件。考虑到这一点,为什么有EV_RECEIPT
必要?
苹果 OS X 文档中的一些示例代码实际上使用了 EV_RECEIPT:
但是,由于changes
在调用后从未检查过数组kevent
,我完全不清楚为什么EV_RECEIPT
在这种情况下使用。
EV_RECEIPT 真的有必要吗?在什么情况下它真的有用?
linux - 如何正确等待事件/过程完成不是父母?
我正在使用GO来检查一个进程(不是父进程)是否已终止,基本上类似于FreeBSD中的pwait命令,但用 go 编写。
目前我正在尝试 a for loop
,kill -0
但我注意到这种方法的 CPU 使用率非常高99%,这里是代码:
关于如何改进或正确实施这一点的任何想法。
提前致谢。
更新
sleep
像建议的那样在循环中添加一个有助于减少负载。
从提供的链接来看,似乎可以附加到现有的 pid,我会尝试PtraceAttach但不知道这是否有副作用,有什么想法吗?
正如建议的那样,我可以使用kqueue:
工作正常,但想知道如何在 linux 上实现/实现相同的功能,因为我认为kqueue
它不可用,有什么想法吗?
c - Kqueue(边缘触发):短读是否意味着读准备丢失?
当在边缘触发模式 ( ) 下使用Linux epollEPOLLET
时,读/写失败并带有EAGAIN
/ ,这意味着读/写准备丢失,并且一旦EWOULDBLOCK
准备就绪,就会保证新的准备事件可用epoll_wait()
恢复。
此外,当在边缘触发模式下使用Linux epoll和非阻塞流模式套接字时,如果我们注册了对事件的兴趣EPOLLRDHUP
,并且EPOLLRDHUP
尚未收到事件,则短读/写(返回值小于请求的大小) 也意味着读/写准备的丢失,当重新准备就绪时,我们仍然可以依赖新的准备通知,即使没有读/写因EAGAIN
/失败EWOULDBLOCK
。
类似地,当在边缘触发模式(一旦恢复准备就绪。EV_CLEAR
EAGAIN
EWOULDBLOCK
kevent()
问题:在边缘触发模式下使用Kqueue和非阻塞流模式套接字时,如果我们注册了对事件的兴趣EV_EOF
,并且EV_EOF
尚未收到事件,是否有类似的保证,即短读/写意味着失去读/写准备,并且当重新准备就绪时保证会产生新的准备事件?
编辑:注意:知道短读意味着失去读准备允许我(在一般情况下)避免冗余调用read()
只是为了获得EAGAIN
/EWOULDBLOCK
失败。
Linux epoll 上下文中短读/写的含义来自epoll
(7) 手册页中的此注释:
对于面向流的文件(如管道、FIFO、流套接字),也可以通过检查目标文件描述符读/写的数据量来检测读/写I/O空间耗尽的情况。例如,如果您通过请求读取一定数量的数据来调用 read(2),而 read(2) 返回的字节数较少,则可以确定文件描述符的读取 I/O 空间已用尽。使用 write(2) 写入时也是如此。(如果你不能保证被监控的文件描述符总是指向一个面向流的文件,请避免使用后一种技术。)
macos-sierra - 在 macOS Sierra 上运行 Crystal 时出现损坏的 kqueue 警告
我决定尝试使用 Crystal 来检查它相对于 Ruby 的速度和兼容性。我将预构建的 .pkg 安装程序下载到我的 macOS Sierra 系统中。我的小型测试程序似乎正在运行,但都产生以下消息:
我怀疑与 Sierra 不兼容,或者库过时或丢失。有人知道修复是什么吗?这很烦人,但它也有潜在的危险吗?
macos - OSX 使用 FSevents 或内核队列来捕获打开的不存在文件
我想构建一个用户空间工具来监视任何尝试打开具有特定路径+名称的不存在文件(它不会出现在文件系统中)。
查看可用选项,最接近我需要的选项是使用 kevent 框架。
这是一个由 表示的监视文件的示例path
,它需要文件描述符。如果由于文件不存在而失败,也许有一个选项可以监视对path
事件的每次访问。open
python - 对于使用 requests.Session() 发送发布请求的范围,它会警告“模块”对象没有属性“kqueue”
macOS 10.12.3
python 2.7.13
requests 2.13.0
我使用请求包发送发布请求。此请求需要在发布数据之前登录。所以我使用 request.Session() 并加载登录的 cookie。然后我使用这个会话以循环模式发送帖子数据。
我曾经在 Windows 和 Linux 中运行此代码并没有错误。
简单代码:
但是程序经常(大约每个间隔)崩溃,错误是AttributeError: 'module' object has no attribute 'kqueue'
c++ - 了解 TCP 中的 kqueue
我正在关注关于 kqueue 的教程(特别是http://eradman.com/posts/kqueue-tcp.html和https://wiki.netbsd.org/tutorials/kqueue_tutorial/),并且有些部分我不明白。这是我的(编辑过的)代码:
我不明白:
我是否正确设置 nevents = BACKLOG 即并发连接数?如果不是,那应该是什么?
我为什么要检查
event_list[i].flags & EV_EOF
?我最好的猜测是,如果套接字在队列中时连接失败,那么我想从队列中删除那个套接字?但是为什么我又打电话给 kevent 呢?在与前一点相同的部分中,我调用
close(fd)
. 那是对的吗?埃拉德曼教程有一些额外的巫术,但我不明白为什么。如果我理解正确,当我准备好阅读部分消息时,kqueue 可能会返回。我怎么知道消息何时完成?
如果它是相关的,我正在使用 OS X。
c - Mac OS 和 FreeBSD 之间对 fifos 的 kqueue 处理有何不同?
我正在开发一个将 fifos 用于 IPC 并使用事件通知 API(例如 epoll 或 kqueue)来监视 fifos 以获取要读取的数据的应用程序。
应用程序期望,如果 fifo 的写入器终止,读取器将通过事件通知 API 接收事件,从而允许读取器注意到写入器终止。
我目前正在将此应用程序移植到 macos,并且我在使用 kqueue 时遇到了一些奇怪的行为。我已经能够创建这种行为的复制器:
这个复制器派生了一个子进程,它创建了 2 个 fifo:/tmp/parent-$CHILD_PID
和/tmp/child-$CHILD_PID
. 父级等待直到/tmp/parent-$CHILD_PID
被创建,然后向其写入一个字节。子进程打开/tmp/parent-$CHILD_PID
并阻塞以读取父进程写入的字节。完成后,子进程通过 将相同的字节写入父进程/tmp/child-$CHILD_PID
。父级使用 kqueue 来观察写入/tmp/child-$CHILD_PID
。
这一系列事件运行良好。
当孩子关闭其引用的文件时,就会出现此问题/tmp/child-$CHILD_PID
。我看到此事件未通过 kqueue 报告给父级。
最有趣的部分:这段代码在 FreeBSD 上可以正常工作。
版本信息:
Mac OS X: 10.11.6
FreeBSD 10.4-RELEASE-p3
在这种情况下,macos 和 FreeBSD 上的 kqueue 有区别吗?如果是这样,是否有一些文档记录了这种差异?
ruby - Kqueue dirextended 看什么动作?
我在 OS X 上玩rb-kqueue,但我不知道如何让extend
标志触发。
从OpenBSD kqueue 手册页(也与 OS X 手册页匹配):
NOTE_EXTEND 描述符引用的文件被扩展
这是非常循环的。
NOTE_EXTEND 对于常规文件,描述符引用的文件被扩展。对于目录,报告作为重命名操作的结果添加或删除了目录条目。在目录内更改名称时不会报告 NOTE_EXTEND 事件。
这更具描述性,但是,我一直在目录上运行 kqueue 并尝试我可能无法触发扩展标志。我试过mv
, rename
, (因为搜索“扩展”会返回很多关于扩展属性的结果),使用and和重定向xattr
添加子目录和文件,但没有任何结果导致标志成为事件的一部分,只是和/或。mkdir
touch
extend
write
link
因此,我对extend
真正的东西感到困惑。仅仅是因为我在 OS X 上运行它吗?