linux 任务被stuck 或者hung住

当linux系统缓存满了,会以同步的方式写硬盘导致 IO卡顿。

Solution for hung_task_timeout_secs

Explanation

By default Linux uses up to 40% of the available memory for file system caching. After this mark has been reached the file system flushes all outstanding data to disk causing all following IOs going synchronous. For flushing out this data to disk this there is a time limit of 120 seconds by default. In the case here the IO subsystem is not fast enough to flush the data withing 120 seconds. As IO subsystem responds slowly and more requests are served, System Memory gets filled up resulting in the above error, thus serving HTTP requests.


情景1:减少Cache

你可以针对要做的事情,来制定一个合适的值。
在一些情况下,我们有快速的磁盘子系统,它们有自带的带备用电池的NVRAM caches,这时候把数据放在操作系统层面就显得相对高风险了。所以我们希望系统更及时地往磁盘写数据。
可以在/etc/sysctl.conf中加入下面两行,并执行"sysctl -p"

vm.dirty_background_ratio = 5
vm.dirty_ratio = 10

这是虚拟机的典型应用。不建议将它设置成0,毕竟有点后台IO可以提升一些程序的性能。


情景2:增加Cache

在一些场景中增加Cache是有好处的。例如,数据不重要丢了也没关系,而且有程序重复地读写一个文件。允许更多的cache,你可以更多地在内存上进行读写,提高速度。

vm.dirty_background_ratio = 50
vm.dirty_ratio = 80

有时候还会提高vm.dirty_expire_centisecs 这个参数的值,来允许脏数据更长时间地停留。


情景3:增减兼有

有时候系统需要应对突如其来的高峰数据,它可能会拖慢磁盘。(比如说,每个小时开始时进行的批量操作等)
这个时候需要容许更多的脏数据存到内存,让后台进程慢慢地通过异步方式将数据写到磁盘当中。

vm.dirty_background_ratio = 5
vm.dirty_ratio = 80

这个时候,后台进行在脏数据达到5%时就开始异步清理,但在80%之前系统不会强制同步写磁盘。这样可以使IO变得更加平滑


<think>好的,我现在需要解决用户的问题:为什么在Linux中使用`du -sh *`命令会卡,以及如何解决这个问题。首先,我得回忆一下`du`命令的作用和常见问题。 `du`命令用于估算文件或目录的磁盘使用情况,`-s`选项是汇总显示,`-h`是以易读的格式显示。当用户执行`du -sh *`时,系统会遍历当前目录下的所有文件和子目录,统计它们的磁盘使用情况。卡的原因可能有多种,需要逐步分析。 首先想到的是目录中存在非常大的文件或目录,处理这些需要较长时间。不过用户可能已经知道这种情况,所以应该还有其他原因。比如,某些文件系统的问题,如网络文件系统(NFS)挂载点响应慢,或者遇到了损坏的文件系统导致读取困难。 另一个可能是遇到符号链接循环。虽然`du`默认会处理符号链接,但如果存在大量递归链接,可能会导致命令陷入循环,占用大量资源。这时候可能需要用`-L`选项来跟踪符号链接,或者检查目录结构是否有问题。 还有权限问题,比如某些子目录没有读取权限,导致`du`命令在尝试访问时被阻塞,可能需要使用`strace`或`lsof`工具来查看进程卡在哪个文件或目录上。 此外,文件系统类型也可能影响,比如FUSE或加密文件系统,处理速度较慢。或者有僵尸进程占用资源,导致系统响应迟缓。 解决方法方面,可以分步骤来排查。首先用`du -sh * --time`查看是否有长时间未响应的目录,或者用`strace du -sh *`跟踪系统调用,找到卡的位置。检查是否有挂载点问题,使用`df -hT`查看挂载情况,尝试卸载有问题的挂载点。对于权限问题,用`sudo`提升权限执行命令,或者检查目录权限。排除符号链接问题,使用`find`命令查找可能的循环链接。还可以使用替代命令如`ncdu`或`ls`结合`awk`来统计大小,避免`du`本身的问题。 需要确保用户按照这些步骤逐步排查,找出具体原因。同时提醒用户注意数据安全,特别是在处理挂载点或文件系统时,避免数据丢失。</think>### Linux `du -sh *` 卡的原因及解决方法 #### 一、常见原因分析 1. **大文件或深层目录结构** - `du` 命令需要递归遍历所有子目录,若目录层级过深或包含超大文件(如未正确清理的日志文件),可能导致计算时间过长或假死状态。 2. **挂载点问题** - 当目录包含网络挂载点(如 NFS、SMB)或损坏的存储设备挂载点时,若远程服务无响应或存储设备存在物理故障,`du` 会在此处阻塞[^1]。 3. **符号链接循环** - 循环符号链接(如 `a -> b` 且 `b -> a`)会导致 `du` 陷入无限递归,消耗资源并卡死。 4. **文件系统错误** - 文件系统损坏(如 ext4 元数据错误)或特殊文件系统(如 FUSE、加密文件系统)可能引发读取延迟。 5. **权限问题** - 无权限访问某些子目录时,`du` 可能因等待权限验证而卡(尤其在 SELinux 强制模式下)。 --- #### 二、排查与解决方法 1. **定位卡位置** - 使用 `strace` 跟踪系统调用: ```bash strace -f -o du_trace.log du -sh * ``` 通过日志文件 `du_trace.log` 查看最后访问的文件/目录。 2. **排除挂载点影响** - 检查挂载点状态: ```bash df -hT ``` - 临时卸载可疑挂载点: ```bash umount /path/to/mountpoint ``` 3. **处理符号链接问题** - 使用 `find` 检测循环链接: ```bash find . -type l -exec ls -l {} \; | grep "->" ``` - 通过 `-L` 强制跟踪符号链接(慎用): ```bash du -Lsh * ``` 4. **绕过权限限制** - 以 root 权限执行命令: ```bash sudo du -sh * ``` - 检查目录权限: ```bash ls -la /path/to/stuck_directory ``` 5. **替代方案** - 使用交互式工具 `ncdu`: ```bash ncdu --exclude /mnt # 排除网络挂载点 ``` - 通过 `ls` 粗略统计: ```bash ls -lAh | awk '{sum += $5} END {print sum}' ``` 6. **文件系统修复** - 强制卸载并检查文件系统: ```bash umount /dev/sdX fsck /dev/sdX ``` --- #### 三、操作注意事项 - **谨慎处理挂载点**:卸载前确保无程序正在访问挂载点内容。 - **备份重要数据**:修复文件系统前建议备份。 - **日志分析**:检查 `/var/log/syslog` 或 `dmesg` 输出,寻找 I/O 错误记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值