问题标签 [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.

0 投票
2 回答
1097 浏览

linux - 调用 mlockall() 后在同一地址重复出现次要页面错误

问题

在尝试减少/消除应用程序中出现轻微页面错误的过程中,我发现了一个令人困惑的现象;也就是说,即使我认为我已经采取了足够的措施来防止页面错误,我也会反复触发对同一地址的写入的次要页面错误。

背景

根据这里的建议,我打电话mlockall将所有当前和未来的页面锁定到内存中。

在我最初的用例(涉及一个相当大的数组)中,我还按照此处的建议通过写入每个元素(或至少写入每个页面)来预先故障数据;虽然我意识到那里的建议是针对运行带有 RT 补丁的内核的用户,但强制写入以阻止 COW/需求分页的一般想法应该仍然适用。

我曾认为这mlockall可以用来防止轻微的页面错误。虽然手册页似乎只保证不会出现重大错误,但各种其他资源(例如上面)表明它也可以用来防止轻微的页面错误。

内核文档似乎也表明了这一点。例如,unevictable-lru.txtpagemap.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 上运行它没有影响;以更高的优先级运行也不行。但是,以实时优先级运行可以消除页面错误。

问题

  1. 这种行为是预期的吗?
    1a。什么解释了时间?
  2. 有可能防止这种情况吗?

版本

我正在运行带有内核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函数中的变量,但修复很简单)

0 投票
1 回答
90 浏览

systemtap - 如何在 systemtap 中获取系统调用文档

我阅读了 有关probe、function文档 的文档在此处输入图像描述

和用法:

probe::ioblock.end [probe::ioblock] (3stap) - 每当块 I/O 传输完成时触发 probe::ioblock.request [probe::ioblock] (3stap) - 每当创建通用块 I/时触发请求

但是如何从 man
示例中获取系统调用文档:syscall.write文档

0 投票
2 回答
9851 浏览

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:

  1. Run the program in question under the GDB
  2. From another terminal launch systemtap script:

    /li>
  3. 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:

  1. I still can't distinct between call and return from syscall
  2. If I use finish in comm I can't use continue, which is OK according to GDB docs
    i.e. the following does drop to gdb prompt on each break:

    /li>
  3. Actually I can avoid using finish and check %rax in commands 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 right

  4. So the only way to make it work for me was to define custom function and use it in the following way:

    /li>
0 投票
7 回答
762 浏览

c - 如何对 Linux 内核中的特定功能进行基准测试或跟踪?

如何使用 ftrace()(或其他任何东西)来跟踪 Linux 内核中特定的用户定义函数?我正在尝试创建和运行一些微基准测试,所以我希望有时间运行某些功能。我已经(至少尽可能多地)阅读了文档,但是朝着正确方向迈出的一步会很棒。

我倾向于 ftrace(),但在 Ubuntu 14.04 上运行时遇到问题。

0 投票
1 回答
205 浏览

linux - 如何理解 Systemtap 脚本中的“$location”?

Systemtap 脚本:

kfree_skb() 的源代码是:

我只想知道从哪里来$location?和之间
是什么关系?谢谢你。$locationkfree_skb()

0 投票
1 回答
58 浏览

systemtap - 我们可以在 systemtap 探针中进行系统调用吗?

例如,给定

我可以在 pwrite 的探测中做一个 pread 吗?

谢谢!

二本

0 投票
1 回答
318 浏览

linux - linux内核空间中pread的等价性(使用O_DIRECT)

我正在使用 linux 内核空间中的 systemtap 探针,所以我不能使用常规的 pread 系统调用。内核空间中是否存在等价的预系统调用?

我的朋友发现了这个: http://lxr.free-electrons.com/source/fs/read_write.c?v= 2.6.32#L433 但我需要包含的头文件是什么?

谢谢!

二本

0 投票
1 回答
125 浏览

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

没有区别。

0 投票
0 回答
80 浏览

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 ,因此我陷入了僵局。

0 投票
2 回答
603 浏览

arrays - 在 systemtap 中获取目标数组的大小

一个姊妹网站的回答中,我试图从unix_socket_table@net/unix/af_unix.c定义为的 Linux 内核数组中转储信息:

目前,我在stp脚本中硬编码数组的大小:

我怎么能避免呢?该信息(数组的大小)存储在调试信息中。gdb可以告诉我:

但是我该怎么做呢systemtap?AFAICT,systemtap 没有sizeof()操作员。