AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 844763
Accepted
UpTheCreek
UpTheCreek
Asked: 2017-04-17 09:32:26 +0800 CST2017-04-17 09:32:26 +0800 CST 2017-04-17 09:32:26 +0800 CST

什么可能导致 strace 结果中重复的 mmap/munmap?

  • 772

我有一个 (node.js) 应用程序,它偶尔会导致 100% 的 CPU 使用率。当它处于这种状态时,我已经附加到该过程strace- 但如果 strace 输出,我不知道该怎么做。结果在这两种模式之间重复(缩短):

mmap(0x30c3ac700000, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x30c3ac700000
mmap(0x3364514ba000, 2097152, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x3364514ba000
munmap(0x3364514ba000, 286720)          = 0
munmap(0x336451600000, 761856)          = 0
mmap(0x336451500000, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x336451500000
mmap(0x2b9c33880000, 2097152, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2b9c33880000
munmap(0x2b9c33880000, 524288)          = 0
munmap(0x2b9c33a00000, 524288)          = 0
...

和...

munmap(0x2b9c33900000, 1048576)         = 0
munmap(0x336451500000, 1048576)         = 0
munmap(0x30c3ac700000, 1048576)         = 0
munmap(0x247e37500000, 1048576)         = 0
munmap(0x20d76c800000, 1048576)         = 0
munmap(0x1cae0d600000, 1048576)         = 0
munmap(0x163545100000, 1048576)         = 0
munmap(0x32dcfe700000, 1048576)         = 0
munmap(0x1a1feff00000, 1048576)         = 0
munmap(0x3fb72f00000, 1048576)          = 0
munmap(0x366536900000, 1048576)         = 0
...

任何人都可以阐明这里可能发生的事情吗?谢谢!

node.js
  • 1 1 个回答
  • 1173 Views

1 个回答

  • Voted
  1. Best Answer
    kasperd
    2017-04-17T10:19:59+08:002017-04-17T10:19:59+08:00

    从这个输出可以推断出应用程序正在分配和释放内存。所以肯定有一些数据结构在增长和缩小。

    不幸的是,这并没有说明应用程序更高层发生的事情。

    我们还可以推断出内存管理实现node.js是如何实现的,因为mmap.

    PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE
    

    这些参数分配地址空间,但PROT_NONE意味着不能使用保留的地址空间(除非稍后的另一个调用使其可访问)。

    PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS
    

    这些参数为特定范围的地址分配实际内存(可能是先前与其他参数组合分配的)并将其转换为读/写区域。

    为什么会这样,我们可以通过查看这四个系统调用的序列来猜测:

    mmap(0x3364514ba000, 2097152, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x3364514ba000
    munmap(0x3364514ba000, 286720)          = 0
    munmap(0x336451600000, 761856)          = 0
    mmap(0x336451500000, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x336451500000
    

    这将分配 2MB 的地址空间。然后释放该地址空间的开始和结束,最后为分配的地址空间的中间部分分配 1MB 内存。

    实际上,这四个调用分配了 1MB 的内存,地址对齐为 1MB 的倍数。因此,我们正在研究一种明确需要对齐地址的模式。

    后面的munmap调用只是释放之前分配的 1MB 块。我特别注意到

    munmap(0x336451500000, 1048576)         = 0
    

    这释放了在上述四个系统调用中分配的 1MB 块。

    这一切可能不是你想知道的。但不幸的是,这是可以从strace输出中推断出来的,所以你必须找到其他方法来找到你真正想知道的信息。

    您可能对转储堆栈跟踪的信号的此功能请求感兴趣,这可能对您现在非常有用。

    另一种可能性是向您的应用程序添加更多日志记录代码。

    • 3

相关问题

  • 用户注销后如何使用nohup继续运行命令?

  • nginx配置中proxy_set_header的不同字段

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve