游乐游手机版
首页/系统平台/文章详情

Linux系统挂起时如何查看进程内存分配失败记录

时间:2026-08-23 11:28
答案是:先执行dmesg -T | grep -i "page allocation failure|low memory|watermark "定位关键内核信号,再结合 proc pid stack确认目标进程是否阻塞在__alloc_pages_slowpath等内存分配路径中,从而排查 Linu

答案是:先执行dmesg -T | grep -i "page allocation failure|low memory|watermark"定位关键内核信号,再结合/proc/pid/stack确认目标进程是否阻塞在__alloc_pages_slowpath等内存分配路径中,从而排查 Linux 进程内存分配失败引发的系统挂起问题。

Linux如何查看具体的进程内存分配失败导致的系统挂起记录

查 dmesg 里有没有 “page allocation failure”

如果进程没有被直接杀掉,也没有明显报错,却一直卡住不响应,这类“挂起”现象通常并不是应用自身停止运行,而是 Linux 内核在申请内存时发生失败,随后进入等待、回收或重试流程,最终让进程看起来像僵死一样。最直接、最有价值的排查线索就在内核环形缓冲区中。其中,page allocation failure 是最关键的日志信号,它通常比 Out of memory 出现得更早,也更能说明“内存分配失败导致进程挂起”这一根本原因。

执行:
dmesg -T | grep -i "page allocation failure|low memory|watermark"
如果看到类似:

[Tue Jul7 23:41:02 2026] lowmemorykiller: Killing 'ja va' (12345), adj 0, to free 12345kB on node 0
[Tue Jul7 23:41:02 2026] page allocation failure: order:4, mode:0x140cca

这说明内核已经无法满足连续 2^4=16 页的物理内存分配请求。按默认页大小 4KB 计算,也就是 64KB 的连续页申请失败,系统此时通常会触发内存回收,严重时甚至直接 kill 进程。但在某些分配场景下,例如 GFP_ATOMIC 上下文,内核连 kill 都来不及执行,进程就可能直接卡在 __alloc_pages_slowpath 这条慢速分配路径上。

  • order 值越大,表示需要的连续物理页越多,分配失败的概率越高,尤其是在内存碎片严重的 Linux 服务器上更常见
  • mode 字段中如果包含 GFP_ATOMICGFP_NOWAIT,通常表示这次内存分配不能睡眠等待,失败后更容易出现阻塞、卡顿或无明显异常返回
  • 即使日志中没有出现 Killed process,也不代表系统安全,可能只是还没执行到 kill,或者进程已经卡死在内存分配路径上,根本没有机会进入后续处理

看 /proc/[pid]/stack 确认进程是否卡在内存分配栈

找到疑似挂起的进程 PID 之后,最直接的办法就是查看它的内核调用栈:
cat /proc/12345/stack
如果输出中反复出现 __alloc_pages_slowpathwait_event_killabletry_to_free_pages 这些函数,基本就可以判断该进程正卡在 Linux 内存分配或内存回收路径上。

常见卡点包括:

  • __alloc_pages_nodemask → __alloc_pages_slowpath → wait_event_killable:说明进程正在等待内存回收完成,但系统迟迟回收不到足够可用页
  • shrink_slab → shrink_node → shrink_page_list:说明内核正尝试回收 slab 或页面缓存,但当前内存压力过大,回收效率不足
  • 空栈,或只看到一行 [<0000000000000000>] 0x0:通常表示进程处于不可中断的 D 状态,这类情况往往也与上述内核内存路径阻塞有关

用 vmstat 和 pidstat 捕捉分配失败前的内存压力信号

仅仅查看日志更适合事后回溯;如果想提前发现 Linux 内存不足或内存分配失败风险,就需要结合实时监控指标。重点关注以下三个信号:

  • vmstat 1 中的 pgpgin/pgpgout 持续升高,同时 pgmajfault > 100/s:说明系统频繁发生缺页,大量消耗 page cache,内存压力已经明显上升
  • pidstat -r 1 显示某个进程 %mem 基本稳定,但 VSZ 快速增长、RSS 却没有同步上涨:这通常意味着进程通过 mmap 申请了大块虚拟地址空间,却尚未真正映射为物理页,一旦实际访问这些内存,就可能触发卡顿甚至挂起
  • cat /proc/zoneinfo | grep -A5 "Node [0-9] DMA|Normal|HighMem"pagesets 下的 free 接近 0,同时 low watermark 持续被击穿:说明内核已经进入紧急内存回收阶段,后续很容易出现 page allocation failure

这些指标本身不是“内存分配失败记录”,但往往是失败发生前几秒最明确、最稳定的预警信号。很多时候,等到 page allocation failure 真正出现在日志里,系统实际上已经处在高风险状态了。

注意 /var/log/messages 里没有对应记录是正常的

需要注意的是,排查这类问题时,dmesg 往往才是最可靠的第一手信息来源。像 /var/log/messagesjournalctl,很多情况下并不会完整记录 page allocation failure 这类底层内核告警。原因在于,它们默认可能会过滤掉 kernel log level 小于 3 的消息,也就是低于 KERN_ERR 的日志。而 page allocation failure 常见级别通常是 KERN_WARNING(level 4)。dmesg 会直接展示内核缓冲区中的完整内容,但 rsyslog 或其他日志组件却有可能把这些 warning 级别信息过滤掉。

验证方式:
dmesg | head -n 20 | grep -o "level=[0-9]" 查看实际日志等级
grep -r "level.*4" /etc/rsyslog.conf /etc/rsyslog.d/ 检查是否配置了接收 WARNING 级别日志

因此,不要只在 journalctl/var/log/messages 中反复搜索这个关键词,真正排查 Linux 内存分配失败、系统挂起和进程卡死问题时,dmesg -T 才是最关键的排查入口。

来源:https://www.php.cn/faq/3029505.html
上一篇银河麒麟终端清屏命令与快捷键使用方法 下一篇UOS系统提示显卡硬件加速未开启的解决方法
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
VMware安装Ubuntu完整教程:创建虚拟机与启动验证
系统平台 · 2026-09-01

VMware安装Ubuntu完整教程:创建虚拟机与启动验证

本教程详细演示如何在VMware中创建Ubuntu虚拟机,涵盖ISO挂载、硬件配置、安装向导及启动验证。通过清晰的步骤与验证命令,帮助新手快速搭建可用的Linux学习环境。

Win10专业版U盘安装教程:制作启动盘与完整安装步骤
系统平台 · 2026-09-01

Win10专业版U盘安装教程:制作启动盘与完整安装步骤

本文提供Win10专业版U盘安装完整流程:准备8GB以上U盘与官方镜像,制作启动盘并核对盘符;通过F12 F11 Esc等快捷键或BIOS设置U盘为第一启动项;安装时选择专业版并谨慎分区;完成后在“设置—系统—关于”验证版本与激活状态。操作前务必备份数据。

Windows10系统字体太小怎么调大
系统平台 · 2026-08-27

Windows10系统字体太小怎么调大

Windows10系统字体太小怎么调大?只需两步:首先打开设置中的显示选项,将缩放比例调整为125%或150%;随后运行ClearType文本调谐器优化字体清晰度。此方法适用于高分屏及普通屏幕,无需修改注册表即可解决界面拥挤问题。

Win10磁盘占用100%基础排查:从监控到清理的完整步骤
系统平台 · 2026-08-27

Win10磁盘占用100%基础排查:从监控到清理的完整步骤

Windows 10系统出现磁盘占用100%会导致电脑卡顿、程序响应缓慢。本文提供基础排查方案:首先通过任务管理器确认是否为磁盘高负载,随后进入系统存储页面分析C盘占用类别,最后针对性清理临时文件。遵循此流程可有效缓解磁盘压力,避免盲目重装系统。

Windows10系统怎么显示此电脑和控制面板
系统平台 · 2026-08-27

Windows10系统怎么显示此电脑和控制面板

Windows10默认可能不显示桌面图标,导致找不到“此电脑”和“控制面板”。只需进入个性化设置,在“桌面图标设置”中勾选对应选项即可恢复。本文提供详细图文步骤,帮助快速找回系统入口。