节点配置文件中的 ___mac_get_pid 符号是啥?
Posted
技术标签:
【中文标题】节点配置文件中的 ___mac_get_pid 符号是啥?【英文标题】:What is the ___mac_get_pid symbol in a node profile?节点配置文件中的 ___mac_get_pid 符号是什么? 【发布时间】:2017-03-20 07:30:16 【问题描述】:我正在分析一些在 OSX 上运行的多进程 nodejs 代码。
我看到了:
[C++]:
ticks total nonlib name
23398 63.6% 63.8% ___mac_get_pid
___mac_get_pid
是什么?它的名字肯定暗示它是一些“在 Mac 上获取 PID”的代码,但时间似乎过长了。
谷歌搜索没有提供任何有用的信息。
【问题讨论】:
@closevoter 你能表达你对这个问题的担忧吗?这是一个我正在寻找和回答的合理问题,如果可能的话,我很乐意改进它。 Dancrumb,您的分析器是什么以及您是如何启动它的。有没有能够记录调用堆栈的分析器?或者尝试在调试器 (gdb/lldb) 中多次停止应用程序,并在您点击__mac_get_pid
时检查回溯以了解是谁调用了它。您的操作系统是什么,您的应用程序是什么,是否有进程列表功能?您使用哪些库?
Dancrumb,您的配置文件中还有其他功能吗?你能发布更多的配置文件,包括 C/C++ 和节点函数吗?其中一些可能会给出关于 ___mac_get_pid 的提示;可能它连接到等待某些进程/线程和/或连接(或者可能在此附近出现一些超时)。您使用哪些库/模式将多个进程连接在一起并交换消息?您是否有排序 nodejs 示例来重现这种情况? OSX/macOS 和 nodejs 有哪些版本?
@osgx 这一切都可能超出了这个特定问题的范围。为了您的启迪,这是 OSX 上的一个 nodejs 应用程序,它使用本机节点 child_process
函数来生成并与多个进程通信。我猜这些调用与 IPC 请求有关。
它超越了“什么是”,但它对于“为什么它在配置文件中如此之高”的问题很有用,并且有时会出现这个问题(链接:***.com/questions/40456982/…)跨度>
【参考方案1】:
__mac_get_pid
是mac_get_pid
库函数背后的系统调用。它在手册页mac_get
:http://man.cx/mac_get(3)中有描述
mac_get_pid .. 获取文件、套接字、套接字对等体或进程的标签 mac_get_pid() 和 mac_get_proc() 系统调用返回与任意进程 ID 或当前进程关联的进程标签。
必须首先使用 mac_prepare(3) 函数分配和准备用于这些调用的标签存储。当应用程序使用标签完成时,内存可能会使用 mac_free(3) 返回。
这里的“MAC”不是 Mac OS X / macOS,而是POSIX.1e 的Mandatory Access Control(“作为TrustedBSD 项目的一部分在FreeBSD 5.0 中引入”)。 mac_get_pid
是 implemented in macOS/Dawrin/XNU 作为“扩展的非 POSIX.1e 接口”。
可能在使用过的 nodejs 库中有一些方法会尝试对进程列表(如 ps/top)进行详细处理,但它们无法限制请求的速率。使用探查器(不是v8 profiler,它仅跟踪js,而是附加到nodejs进程的一些外部探查器)或调试器(gdb / lldb)通过手动停止和检查回溯,直到找到谁调用,使用mac_get_pid
获取多个堆栈跟踪mac_get_pid
(当您不在 mac_get_pid
时继续并再次停止)是找出谁调用它的必要步骤。
【讨论】:
2003 年关于 TrustedBSD 设计的论文:trustedbsd.org/trustedbsd-usenix2003freenix.pdf "The TrustedBSD MAC Framework: Extensible Kernel Access Control for FreeBSD 5.0": "... 标签管理库和系统调用,允许应用程序以抽象的方式处理MAC标签和元素获取当前或任意进程的标签;设置当前进程标签。mac_get_pid()"。登录/授权管理也可能需要 MAC 管理...以上是关于节点配置文件中的 ___mac_get_pid 符号是啥?的主要内容,如果未能解决你的问题,请参考以下文章
架构师成长记_第九周_02_配置nginx, 实现fastdfs文件服务器
架构师成长记_第九周_02_配置nginx, 实现fastdfs文件服务器