【问题标题】:What interprocess locking calls should I monitor?我应该监控哪些进程间锁定调用?
【发布时间】:2010-02-08 02:25:51
【问题描述】:

我正在使用strace/ltrace 监视一个进程,希望找到并拦截一个检查并可能激活某种全局共享锁的调用。

虽然我之前在 Linux 上处理并阅读过几种形式的进程间锁定,但我对调用要查找的内容一无所知。

目前我唯一的嫌疑人是futex(),它在流程执行的早期就出现了。

更新0

我对我所追求的有些困惑。我正在监控现有进程以调用持久的进程间内存或等效。我想知道要查找的系统和库调用。我无意自己调用这些,所以自然会出现futex(),我相信很多库都会在这方面实现它们的锁定调用,等等。

更新1

我想要一个函数名称列表或文档链接,我应该在ltracestrace 级别进行监控(并指定哪个)。任何其他关于如何跟踪和定位全局锁的好建议都会很棒。

【问题讨论】:

  • 您可以监控futexsemop。有时pipe 可用于进程的锁定和排序。基于共享内存的原子操作同步不使用任何系统调用。
  • @osgx:你能描述一下这些原子操作吗?
  • 我错了。不仅是原子的,而且对共享内存的顺序读/写都可以用于同步。所以你不能用 ltrace/strace 监控原子和读/写。即使 futex 也不会每次都进行系统调用。 atomic:最简单的方法是 pthread_spinlock,和gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html 但是 gcc atomics 是内联的
  • 为什么我不能开始赏金?

标签: linux locking interprocess strace ltrace


【解决方案1】:

如果你可以在valgrind中启动被监控的进程,那么有两个项目:

http://code.google.com/p/data-race-test/wiki/ThreadSanitizer

和赫尔格林德

http://valgrind.org/docs/manual/hg-manual.html

Helgrind 知道所有的 pthread 抽象并跟踪它们的效果 尽可能准确。在 x86 和 amd64 平台,它理解和 部分处理隐式锁定 因使用 LOCK 而产生 指令前缀。

因此,此工具甚至可以检测原子内存访问。他们会检查 pthread 的使用情况

【讨论】:

  • 好吧,我已经失去了兴趣,但我现在怀疑 Helgrind 将是用最少的努力跟踪这些事情的最佳机会。
  • Matt Joiner,Thread Sanitizer 有一些有趣的特性,并试图监控比 Helgrind 更多的锁定类型。它是谷歌内部的产品,所以它可以更好
  • 感谢您的额外提示,如果我再次遇到此问题,我会检查一下。
【解决方案2】:

flock 是另一个好人

【讨论】:

  • +1:谢谢。作为额外的奖励,它是 Linux 下的系统调用,但不会出现在我的监控中。
【解决方案3】:
  1. 有许多系统调用可用于锁定:flock、fcntl,甚至 create。

  2. 当您使用 pthreads/sem_* 锁时,它们可能会在用户空间中执行,因此您永远不会 在 strace 中查看它们,因为 futex 仅用于挂起的操作。就像当你实际上 需要等待。

  3. 某些操作只能在用户空间中完成 - 比如自旋锁 - 你永远看不到它们 除非他们为计时器做了一些等待 - 退避,所以当一个锁等待另一个锁时,您可能只会看到诸如 nanosleep 之类的东西。

所以没有“通用”的方法来追踪它们。

【讨论】:

    【解决方案4】:

    在带有 glibc ~ >= 2.5 (glibc + nptl) 的系统上,您可以使用进程共享

    semaphores (last parameter to sem_init), more precisely, posix unnamed semaphores
    
    posix mutexes (with PTHREAD_PROCESS_SHARED to pthread_mutexattr_setpshared)
    
    posix named semaphores (got from sem_open/sem_unlink)
    
    system v (sysv) semaphores: semget, semop
    

    在带有 glibc 2.2、2.3 和 linuxthreads 的旧系统上或带有 uClibc 的嵌入式系统上,您只能使用 system v (sysv) 信号量进行迭代进程通信。

    upd1:必须检查任何 IPC 和 socker。

    【讨论】:

    • 如果你想保持可移植性(操作系统和架构),请不要直接使用 futexes。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多