问题标签 [systemtap]
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.
linux - 调用 mlockall() 后在同一地址重复出现次要页面错误
问题
在尝试减少/消除应用程序中出现轻微页面错误的过程中,我发现了一个令人困惑的现象;也就是说,即使我认为我已经采取了足够的措施来防止页面错误,我也会反复触发对同一地址的写入的次要页面错误。
背景
根据这里的建议,我打电话mlockall
将所有当前和未来的页面锁定到内存中。
在我最初的用例(涉及一个相当大的数组)中,我还按照此处的建议通过写入每个元素(或至少写入每个页面)来预先故障数据;虽然我意识到那里的建议是针对运行带有 RT 补丁的内核的用户,但强制写入以阻止 COW/需求分页的一般想法应该仍然适用。
我曾认为这mlockall
可以用来防止轻微的页面错误。虽然手册页似乎只保证不会出现重大错误,但各种其他资源(例如上面)表明它也可以用来防止轻微的页面错误。
内核文档似乎也表明了这一点。例如,unevictable-lru.txt和pagemap.txt声明mlock()
'ed 页面是不可回收的,因此不适合回收。
尽管如此,我还是继续触发了几个小页面错误。
例子
我创建了一个非常精简的示例来说明问题:
在这里,我反复写信到同一个地址。很容易看到(例如通过cat /proc/[pid]/status | awk '{print $10}'
),在初始化完成后很长时间内我仍然有轻微的页面错误。
运行中pfaults.stp
包含的脚本的修改版本* systemtap-doc
,我记录了每个页面错误的时间、触发错误的地址、触发错误的指令的地址、是否是主要/次要和读/写。在启动和 的初始故障之后mlockall
,所有故障都是相同的:尝试写入x
触发了次要写入故障。
连续页面错误之间的间隔显示出惊人的模式。对于一次特定的运行,间隔以秒为单位:
2, 4, 4, 4.8, 8.16, 13.87, 23.588, 40.104, 60, 60, 60, 60, 60, 60, 60, 60, 60, ...
这似乎是(大约)指数回退,绝对上限为 1 分钟。
在隔离的 CPU 上运行它没有影响;以更高的优先级运行也不行。但是,以实时优先级运行可以消除页面错误。
问题
- 这种行为是预期的吗?
1a。什么解释了时间? - 有可能防止这种情况吗?
版本
我正在运行带有内核3.13.0-24-generic
和 Systemtap 版本的 Ubuntu 14.04 2.3/0.156, Debian version 2.3-1ubuntu1 (trusty)
。编译时gcc-4.8
没有额外标志的代码,尽管优化级别似乎无关紧要(前提是asm volatile
指令保留在原位;否则写入会完全优化)
如果它们被证明是相关的,我很乐意提供更多详细信息(例如,确切的stap
脚本、原始输出等)。
*实际上,vm.pagefault
我的内核和 systemtap 组合的探针被破坏了,因为它引用了一个不再存在于内核handle_mm_fault
函数中的变量,但修复很简单)
systemtap - 如何在 systemtap 中获取系统调用文档
我阅读了 有关probe、function文档 的文档
和用法:
probe::ioblock.end [probe::ioblock] (3stap) - 每当块 I/O 传输完成时触发 probe::ioblock.request [probe::ioblock] (3stap) - 每当创建通用块 I/时触发请求
但是如何从 man
示例中获取系统调用文档:syscall.write
文档
c - How can I set breakpoint in GDB for open(2) syscall returning -1
OS: GNU/Linux
Distro: OpenSuSe 13.1
Arch: x86-64
GDB version: 7.6.50.20130731-cvs
Program language: mostly C with minor bits of assembly
Imagine that I've got rather big program that sometimes fails to open a file. Is it possible to set breakpoint in GDB in such way that it stops after open(2)
syscall returns -1?
Of course, I can grep through the source code and find all open(2)
invocations and narrow down the faulting open()
call but maybe there's a better way.
I tried to use "catch syscall open"
then "condition N if $rax==-1"
but obviously it didn't get hit.
BTW, Is it possible to distinct between a call to syscall (e.g. open(2)
) and return from syscall (e.g. open(2)
) in GDB?
As a current workaround I do the following:
- Run the program in question under the GDB
From another terminal launch systemtap script:
/li>- After
open(2)
returns -1 I receive SIGSTOP in GDB session and I can debug the issue.
TIA.
Best regards,
alexz.
UPD: Even though I tried the approach suggested by n.m before and wasn't able to make it work I decided to give it another try. After 2 hours it now works as intended. But with some weird workaround:
- I still can't distinct between call and return from syscall
If I use
/li>finish
incomm
I can't usecontinue
, which is OK according to GDB docs
i.e. the following does drop to gdb prompt on each break:Actually I can avoid using
finish
and check %rax incommands
but in this case I have to check for -errno rather than -1 e.g. if it's "Permission denied" then I have to check for "-13" and if it's "No such file or direcory" - then for -2. It's just simply not rightSo the only way to make it work for me was to define custom function and use it in the following way:
/li>
c - 如何对 Linux 内核中的特定功能进行基准测试或跟踪?
如何使用 ftrace()(或其他任何东西)来跟踪 Linux 内核中特定的用户定义函数?我正在尝试创建和运行一些微基准测试,所以我希望有时间运行某些功能。我已经(至少尽可能多地)阅读了文档,但是朝着正确方向迈出的一步会很棒。
我倾向于 ftrace(),但在 Ubuntu 14.04 上运行时遇到问题。
linux - 如何理解 Systemtap 脚本中的“$location”?
Systemtap 脚本:
kfree_skb() 的源代码是:
我只想知道从哪里来$location
?和之间
是什么关系?谢谢你。$location
kfree_skb()
systemtap - 我们可以在 systemtap 探针中进行系统调用吗?
例如,给定
我可以在 pwrite 的探测中做一个 pread 吗?
谢谢!
二本
linux - linux内核空间中pread的等价性(使用O_DIRECT)
我正在使用 linux 内核空间中的 systemtap 探针,所以我不能使用常规的 pread 系统调用。内核空间中是否存在等价的预系统调用?
我的朋友发现了这个: http://lxr.free-electrons.com/source/fs/read_write.c?v= 2.6.32#L433 但我需要包含的头文件是什么?
谢谢!
二本
linux - SystemTap 脚本奇怪的行为
我有一个简单的 ST 脚本,它计算每个文件的进程 io 大小:
当我跑步时,stap test.stp -c 'cat test.stp'
我得到:
这几乎是正确的。但是当我执行时,stap test.stp -c 'cat test.stp > /dev/null'
我得到了一些奇怪的东西:
为什么我 test.stp opened as 3
在第二种情况下看不到?
我用 strace 做了一些测试:
1)strace -e open -o trace cat test.stp
:
2)strace -e open -o trace cat test.stp > /dev/null
:
没有区别。
linux-kernel - 在内核 3.1 上安装 perf/system tap 时出现问题
我在内核 3.1 上使用 glibc 2.14 定制了 linux。现在,当我尝试安装 perf/systemtap 它要求 glibc2.15 时,我无法删除现有的 glibc2.14,因为它具有链接到它的依赖项。有没有办法可以安装 perf/system tap。希望我能够清楚地解释自己。
详细信息: perf 需要 libnewt & libslang 这需要 glibc2.15 ,因此我陷入了僵局。
arrays - 在 systemtap 中获取目标数组的大小
在一个姊妹网站的回答中,我试图从unix_socket_table@net/unix/af_unix.c
定义为的 Linux 内核数组中转储信息:
目前,我在stp
脚本中硬编码数组的大小:
我怎么能避免呢?该信息(数组的大小)存储在调试信息中。gdb
可以告诉我:
但是我该怎么做呢systemtap
?AFAICT,systemtap 没有sizeof()
操作员。