进程内存布局异常导致的问题如何排查解决?

2026-05-27 14:390阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计3525个文字,预计阅读时间需要15分钟。

进程内存布局异常导致的问题如何排查解决?

近期业务更新了bash,之后ssh连接上去出现登录失败,客户端输出错误信息如下:+ 图-0-该版本bash为门限这边所定义,但实现上与原生版并无不同,那么

前段时间业务反映某类服务器上更新了 bash 之后,ssh 连上去偶发登陆失败,客户端吐出错误信息如下所示:

图 - 0

该版本 bash 为部门这边所定制,但是实现上与原生版并没有不同,那么这些错误从哪里来?

是 bash 的锅吗

从上面的错误信息可以猜测,异常是 bash 在启动过程中分配内存失败所导致,看起来像是某些情况下该进程错误地进行了大量内存分配,最后导致内存不足,要确认这个事情比较简单,动态内存分配到系统调用这一层上主要就两种方式: brk() 和 mmap(), 所以只要统计一下这两者的调用就可以大概估算出是否有大内存分配了。

bash 是由 sshd 启动的,于是 strace 跟踪了一下 sshd 进程,结果发现异常发生时,bash 分配的内存非常地少,少到有时甚至只有几十字节也会失败,几乎可以断定 bash 在内存使用上没有异常,但在这期间发现一个诡异的现象,Bash 一直只用 brk 在分配小内存,brk() 失败后就直接退出了,一般程序使用的 libc 中的 malloc (或其它类似的 malloc) 会结合 brk 和 mmap 一起使用,不至于 brk 一失败就分配不到内存,顺手查看了下 bash 的源码,发现它确实基于 brk 做了自己的内存管理,并没有使用 malloc 或 mmap。

但那并不是重点,重点是即使是只使用 brk,也不至于只能分配几十字节的内存。

阅读全文
标签:问题

本文共计3525个文字,预计阅读时间需要15分钟。

进程内存布局异常导致的问题如何排查解决?

近期业务更新了bash,之后ssh连接上去出现登录失败,客户端输出错误信息如下:+ 图-0-该版本bash为门限这边所定义,但实现上与原生版并无不同,那么

前段时间业务反映某类服务器上更新了 bash 之后,ssh 连上去偶发登陆失败,客户端吐出错误信息如下所示:

图 - 0

该版本 bash 为部门这边所定制,但是实现上与原生版并没有不同,那么这些错误从哪里来?

是 bash 的锅吗

从上面的错误信息可以猜测,异常是 bash 在启动过程中分配内存失败所导致,看起来像是某些情况下该进程错误地进行了大量内存分配,最后导致内存不足,要确认这个事情比较简单,动态内存分配到系统调用这一层上主要就两种方式: brk() 和 mmap(), 所以只要统计一下这两者的调用就可以大概估算出是否有大内存分配了。

bash 是由 sshd 启动的,于是 strace 跟踪了一下 sshd 进程,结果发现异常发生时,bash 分配的内存非常地少,少到有时甚至只有几十字节也会失败,几乎可以断定 bash 在内存使用上没有异常,但在这期间发现一个诡异的现象,Bash 一直只用 brk 在分配小内存,brk() 失败后就直接退出了,一般程序使用的 libc 中的 malloc (或其它类似的 malloc) 会结合 brk 和 mmap 一起使用,不至于 brk 一失败就分配不到内存,顺手查看了下 bash 的源码,发现它确实基于 brk 做了自己的内存管理,并没有使用 malloc 或 mmap。

但那并不是重点,重点是即使是只使用 brk,也不至于只能分配几十字节的内存。

阅读全文
标签:问题