问题标签 [futex]
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.
c++ - boost - timed_wait 不等待
我在 Linux OS + ARM 处理器 + boost 1.51 上运行以下代码。但是,代码没有按预期工作,并且 timed_wait() 调用立即返回。
在具有相同 ARM 处理器但不同版本的 Linux + glibc + 相同的 boost 1.51 库的其他系统上,代码可以正常工作并等待 1 秒。
我尝试使用 strace 调试问题。我发现在 futex() 不工作的系统中没有调用它的区别。
strace 来自代码正在运行的系统:
strace 来自代码不起作用的系统:
是否需要对内核/glibc 进行更改才能使此代码正常工作?
c++ - 具有多线程编程的 linux 中的 c++ 软件:在 futex 中发现的开销。解决方案?
[更新] 问题解决了!问题是硬件模块。我在重新启动后修复了它。
我编写了一个 C++ 软件,其目的是通过千兆以太网 PCIe 卡(安装在 PC 中)将数据从硬件模块读出到 PC。这个接口的库比较特殊,所以我使用了JAXA专家开发的库。
我的软件是这样的
本软件可以通过改变c++代码中的变量readLength(readLength单位为Bytes)来读取不同包大小的数据。
这是我的问题: 3天前,电脑出了点问题,我重装了Linux(Scientific Linux 6.6)。该软件在重新安装前后的速度是如此不同。详细地说,之前的 1000 字节数据包是 1.6 MB/秒,但现在是 0.6 MB/秒。
我使用strace找出问题所在,我发现[futex]导致了主要问题。下面是我使用strace的结果。我发现 futex 行(从底部算起的第 8 行)导致我的软件开销很大(1283 微秒!)。
该软件相当复杂(至少对我而言),它包括在读取过程之前生成线程、TID 等。在这份strace报告中,您将看到:在接近结尾处(大约最后 10 行)有一些完成声明、rx 开始、rx 设置参数、rx 启动 TID、rx 接收、rx 复制、rx 结束,我标记了(在软件和库中)知道阅读过程从哪里开始。
这是我提到的 futex 行
阅读过程总共花费了 1500 微秒,而之前的阅读时间为 600 微秒(大 2.5 倍)。
我还将结果与 C 库数据读数进行了比较,C 库为 1.8 MB/秒。因此,我认为千兆以太网PCIe卡的驱动程序没有错误。
我在互联网上搜索了很多,但仍然没有解决方案。怎样才能减少这种开销?或者我如何确定库中的哪个函数导致了这个 futex-overhead ?
提前致谢。我急于完成这一步。因此,我真的很希望尽快找到解决方案....
编辑:我做了一些更多的测试。我发现在数据包大小 <=(小于或等于)100 字节的情况下,速度与以前相比没有变化。但是从 200 字节开始,速度要慢得多。我也考虑过 MTU,但 MTU 的设置没有改变(重新安装之前和之后)。编辑(2015/08/02):strace 报告我的软件中的 futex,但我在我的库中找不到任何 futex 命令。
java - Java 周期性地挂在 futex 和非常低的 IO 输出
目前我的应用程序周期性地阻塞在 IO 中,并且输出非常低。我使用一些命令来跟踪该过程。
通过使用jstack,我发现该应用程序挂在 FileOutputStream.writeBytes 上。
通过使用strace -f -c -p pid收集系统调用信息,我发现了这一点。对于正常情况,它同时具有 futex 和 write 系统调用。但是当它变得异常时,只有 futex 系统调用。该应用程序不断调用 futex 但都失败并抛出 ETIMEDOUT,就像这样:
此问题会定期发生,并持续数分钟或数小时,然后再次正常。
特别是,当 IO 被阻塞时,echo 3 > /proc/sys/vm/drop_caches总是让它暂时正常。我用谷歌搜索并找到了一些类似的问题,如下所列。
- 闰秒。不起作用,我们系统的 ntpd 已停止。
- 透明大页错误。https://bugzilla.redhat.com/show_bug.cgi?id=879801 这个和我的问题很相似,但是我的khugepaged进程是正常的,负载总是接近于零。尤其是drop_caches也适用于我的应用程序。而且我的系统也是多核大内存的。它对我不起作用。那么有人遇到过同样的问题或熟悉这个问题吗?
关于我的系统的一些信息。操作系统:Redhat 6.1,内核版本 2.6.31
JDK:1.7.0_05
CPU:X5650,24核
内存:24GB 和 48GB
python - Python:进程在多线程中挂起 futex(0x2a5fcc0, FUTEX_WAIT_PRIVATE, 0, NULL
所以我有一个队列:
我在里面放了一些东西。
我正在产生 15 个线程。
my_thread 类如下所示:
如果我查看日志,我看到的是两个或多个线程同时访问队列,并且当队列为空时,while 循环不会中断。
假设线程已从队列t-0
中取出项目。"first"
但是t-2
线程可能会在线程可以获取"second"
之前获取该项目t-1
,从而使队列为空......但是当检查时,队列t-1
不self.process_q.empty()
为空。所以t-1
线程永远不会退出/完成并挂起。
如果我对进程 ID 进行 strace,我会得到以下信息:
我该如何解决这个问题???
c - 内核中的 Futex 和阻塞
我正在阅读一些文档并尝试了一些futex
在 Linux 中发出系统调用的代码示例。我读到如果thread_a
使用获取互斥锁FUTEX_LOCK_PI
,并说如果另一个线程thread_b
尝试获取相同的互斥锁,则后者(thread_b
)在内核中被阻止。
“在内核中阻塞”到底是什么意思?是不是thread_b
在用户空间中的执行没有恢复?在以下示例中,第二个线程似乎也在系统调用之后发出 printf。这不是表明它没有在内核中被阻止吗?我错过了什么?
输出可以在下面找到:-
java - 为什么java单线程程序使用futex和clone系统调用
这是一个单线程 java 程序,使用递归查找作为参数传递的给定数字的阶乘。
我想知道为什么它使用如此多的 futex 和 clone 系统调用用于作为单线程运行的程序。
c - 导致等待线程返回用户空间
是否有可能唤醒正在等待 futex 锁的线程?我尝试使用信号机制,但它似乎不起作用。还有其他我可以尝试的方法吗?下面,我添加了一个可能与我想要实现的目标相似的示例。
我有一个线程 A 获取 futex 锁“lockA”,如下所示:-
ret = syscall(__NR_futex, &lockA, FUTEX_LOCK_PI, 1, 0, NULL, 0);
我有一个线程 B 试图获取 futex 锁“lockA”,并在内核中阻塞,因为线程 A 已经获取了锁。
ret = syscall(__NR_futex, &lockA, FUTEX_LOCK_PI, 1, 0, NULL, 0);
如果线程 B 确实获得了 lockA,另一个线程 C 将知道它。如果线程 B 没有获得锁,线程 C 会希望线程 B 停止等待锁,并执行其他操作。
所以基本上,在这一点上,我试图弄清楚我是否可以让线程 C“信号”线程 B,这样它就不会再在内核中阻塞了。为了做到这一点,我在线程 B 中设置了一个信号处理程序,如下所示:-
从线程 CI 尝试将信号发送为:-
pthread_kill(tid_of_B, SIGSYS);
我究竟做错了什么?线程B可以被唤醒吗?如果是这样,我应该使用另一种方法吗?
[编辑] 根据下面的评论,我尝试检查 pthread_kill 的返回值并意识到调用没有返回。
linux - 在不相关的进程之间共享 futex
不相关的进程如何使用 futex 进行协作?
假设我有不相关的进程,一个是我的模块的 apache 子进程,另一个是例如后台脚本。
我想使用 futex 在两者之间建立一个带有互斥锁的条件变量,以有利于用户空间的快速代码路径。
在我看来,存储互斥锁的内存可能在一个mmap
'd 文件中,如果该内存被映射,例如mlock
'd 两个进程理论上可以针对同一地址发出 futex 调用。
或者,也许 futex 可以使用FUTEX_FD
.
接受低级、高级和动态语言(C、C++、Python 等)的代码提交。还必须支持“强大的 futex”API。
参考:
python - 找到threading.Lock的futex id
我想检测一个大型 Python 项目,以便能够调试如下所示的生产问题:
在这里,一个线程在某个锁(或条件变量)上等待了 14.4 秒。
我不确定该锁是在 Python 代码中还是在某些第 3 方 C 扩展中创建的,但 Python 在统计上是一个不错的猜测。
在我附加的时候strace
,这个 futex 已经创建好了。我怀疑它是在应用程序启动期间创建的。
我想戳threading.Lock()
和threading.Condition()
对象并找出它们底层的 futex id。
至少我会记录这些 id,以便以后,如果我必须 strace 正在运行的应用程序,我可以将 futex 调用解析为合乎逻辑的东西。
linux - 如何调试 strace 中显示的 futex 争用?
我正在调试多线程 linux 进程中的一个问题,其中某个线程似乎没有执行几秒钟。查看 strace 输出显示它正在等待 futex,例如
1673109 14:36:28.600329 futex(0x44b8d20, FUTEX_WAIT_PRIVATE,
1673109 14:36:33.221850 <... futex resumed> ) = 0 <4.621514>
我怎样才能找出这个 futex(0x44b8d20) 在用户空间中指的是什么,即如何将它映射到一个在内部使用 futex 的锁定结构。