访问 /proc/pid/cmdline 卡死

本文探讨了在使用cgroup时,某些命令如ls、ps等会卡死的现象,并解释了背后的原因。这种情况类似于访问已挂起的NFS服务器时使用cat命令的行为。此外,还介绍了通过查看/proc文件系统来获取系统状态的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用cgroup时,引起各种命令执行卡死,下面这个提到了原因
原始文章:https://rachelbythebay.com/w/2014/10/27/ps/

在使用 ls, ps, pgrep, top,以及类似的命令行时总是卡住(卡死,挂死),但是重新开窗口(重新登录shell还能使用)。也就是所谓的 "state D", 不中断的等待(uninterruptible wait)。跟当你使用 "cat /something/on/a/nfs/mount" 命令去访问已经挂掉的nfs服务器一样。 使用 ^C (Ctrl+C) 也没有反应,它卡死了,退不出来了。(甚至reboot命令都无效,reboot没反应)
然后cpu负载很低,系统IO很高,top命令出现类似 Cpu(s):  1.7%us,  3.3%sy,  0.0%ni, 00.0%id,  100.0%wa,

现在让我来告诉你,到底发生了什么,让我们来看看它的背后到底是什么在搞怪。

Linux系统有一个非常棒的虚拟文件系统叫做 /proc。你可以从这里获取到所有排列有序的关于运行态的信息。/proc/pid/cmdline 可以或多或少的告诉你对应进程的运行参数信息。 /proc/pid/exe 则是一个指向实际运行程序位置的链接(即使它已经被删除了)。

较新的Linux系统也带有一个叫做cgroup的东西。大家一般都叫它为container容器。你可以用它来限制特定资源的上限,使该上限比系统本身的小很多。一个程序(进程)可以被限制只能使用2GB的内存,而主机实际有4GB的内存。你也可以设定限制该程序(进程)所能够使用的CPU时间,限制只能运行在哪个CPU核上。或者是限制访问硬盘的带宽。


Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: watchdog: BUG: soft lockup - CPU#55 stuck for 22s! [kworker/55:0:3030] Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: ip_protocol_deliver_rcu+0x19/0x180 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: Modules linked in: 8021q(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: ip_local_deliver_finish+0x44/0x50 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: garp(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: __netif_receive_skb_one_core+0x55/0x80 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: process_backlog+0x8a/0x140 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: mrp(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: napi_poll+0x8f/0x1b0 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: bridge(E) stp(E) Jul 16 11:47:13 hpubms033213202226.wulan01 syslog-ng[7143]: syslog-ng starting up; version='3.6.4' Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: net_rx_action+0xaa/0x1b0 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: llc(E) veth(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: __do_softirq+0xba/0x264 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: nfsv3(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: asm_call_irq_on_stack+0xf/0x20 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: nfs_acl(E) nfs(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: </IRQ> Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: lockd(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: do_softirq_own_stack+0x37/0x40 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: irq_exit_rcu+0xab/0xf0 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: grace(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: common_interrupt+0x74/0x130 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: sunrpc(E) nfs_ssc(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: asm_common_interrupt+0x1e/0x40 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: fscache(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: RIP: 0010:acpi_idle_do_entry+0x4f/0x60 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: cls_bpf(E) sch_ingress(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: Code: 15 1a d8 15 02 ed c3 e9 df fd ff ff 65 48 8b 04 25 80 ef 01 00 48 8b 00 a8 08 75 ea e9 07 00 00 00 0f 00 2d 7d fa 67 00 fb f4 <fa> c3 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc 0f 1f 44 00 00 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: xt_conntrack(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: RSP: 0018:ffffa742003cfe80 EFLAGS: 00000246 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: xt_addrtype(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: RAX: 0000000000004000 RBX: 0000000000000001 RCX: ffff92bc3e8f4a80 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: RDX: ffff92bc3e8c0000 RSI: ffff92c045aed000 RDI: ffff92c045aed064 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: xt_set(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: RBP: ffff91c0e3057800 R08: ffffffffab1eea20 R09: 00000000000003e4 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: R10: ffff92bc3e8f2824 R11: 00000000000003e2 R12: 0000000000000001 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: xt_MASQUERADE(E) xt_mark(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: R13: ffffffffab1eeaa0 R14: 0000000000000001 R15: 0000000000000000 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: acpi_idle_enter+0x7d/0xb0 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: ip_set_hash_ipportnet(E) ip_set_hash_ipportip(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: cpuidle_enter_state+0x84/0x330 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: ip_set_hash_ipport(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: cpuidle_enter+0x29/0x40 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: ip_set_bitmap_port(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: cpuidle_idle_call+0x128/0x1b0 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: do_idle+0x72/0xd0 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: ip_set(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: cpu_startup_entry+0x19/0x20 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: secondary_startup_64_no_verify+0xb0/0xbb Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: dummy(E) Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: CPU: 101 PID: 521 Comm: ksoftirqd/101 Kdump: loaded Tainted: G S OE 5.10.112-100.alios7.x86_64 #1 Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: net_ratelimit: 59 callbacks suppressed Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: eth0: hw csum failure Jul 16 11:47:13 hpubms033213202226.wulan01 kernel: skb len=56 headroom=98 headlen=56 tailroom=550
最新发布
07-17
Linux 系统中 `/proc/cmdline` 文件是一个虚拟文件,它包含了系统引导时传递给内核的参数。这些参数由启动加载程序(如 GRUB)从配置文件中读取,并在系统启动时传递给内核,用于控制内核的行为。这些参数在系统启动后仍然可以通过 `/proc/cmdline` 查看,便于用户了解系统的引导信息和内核设置[^3]。 一个典型的 `/proc/cmdline` 文件内容如下: ``` BOOT_IMAGE=/vmlinuz-5.4.0-42-generic root=UUID=eaada718-6f07-45a1-a1b2-5aaae2863d9c ro quiet splash vt.handoff=1 ``` ### 内容解析 1. **BOOT_IMAGE**:指定使用的内核映像路径,例如 `/vmlinuz-5.4.0-42-generic`。 2. **root**:定义根文件系统的设备或 UUID,例如 `UUID=eaada718-6f07-45a1-a1b2-5aaae2863d9c`。 3. **ro**:表示以只读方式挂载根文件系统。 4. **quiet**:减少启动过程中的输出信息,使启动过程更安静。 5. **splash**:启用启动画面,通常用于显示图形化的启动进度条。 6. **vt.handoff=1**:指示 Xorg 在启动后接管虚拟终端。 这些参数可以影响系统的启动行为和运行时配置。例如,`ro` 和 `rw` 参数分别决定根文件系统是以只读还是可读写的方式挂载;`init` 参数可以指定系统启动后执行的第一个进程;而 `nomodeset` 则用于禁用内核模式设置,这在某些显卡驱动不兼容的情况下非常有用。 ### 使用场景 - **调试与诊断**:通过查看 `/proc/cmdline`,管理员可以确认当前内核启动时使用的参数,有助于排查启动问题。 - **动态修改启动参数**:在 GRUB 配置中调整这些参数,可以在不重新编译内核的情况下改变系统行为。 - **自动化脚本**:某些自动化工具可能会依赖 `/proc/cmdline` 来获取当前系统的启动配置,以便进行相应的管理操作。 如果需要查看 `/proc/cmdline` 的内容,可以直接使用 `cat` 命令: ```bash cat /proc/cmdline ``` 该命令会输出当前系统启动时使用的所有内核参数。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值