【handsontable表头源码】【在线ping网页源码】【老马.net oa源码】dstat源码

1.从根上理解IO等待—案例篇
2.由Docker BUG引起的Linux宕机事故及解决办法
3.Linux性能观测之dstat命令详解

dstat源码

从根上理解IO等待—案例篇

       当系统显示I/O等待指标上升,意味着进程在等待硬件资源响应,进入不可中断睡眠状态。在D状态,进程无法被任何信号中断,即使强制终止也无效。handsontable表头源码使用ps或top命令可见此类进程。

       不同状态的进程如何识别?top和ps工具帮助我们理解。R状态表示运行,D状态是Disk Sleep的缩写,表示进程处于不可中断睡眠状态,常见于等待磁盘I/O。Z状态表示进程终止,是僵尸进程,停留在进程表中直到父进程处理。S状态是可中断的睡眠状态,可被信号中断。I状态则是空闲状态,适用于内核线程。在线ping网页源码

       D状态进程导致平均负载升高,I状态则不会。理解这些状态有助于评估系统性能和进程行为。

       除了R、D、Z、S、I状态,进程还有T或t状态,表示暂停或跟踪状态,接收到SIGSTOP信号时出现。X状态是Dead状态,表示进程终止且不在top或ps命令输出中。

       案例分析:多进程应用中,大量进程处于D状态,僵尸进程增加,I/O等待高。应用在C语言下开发,老马.net oa源码通过Docker容器模拟环境。ps命令确认应用启动,显示Ss+和D+状态,s表示领导进程,+为前台进程组。top命令显示平均负载升高至CPU个数,僵尸进程持续增加,CPU使用率不高,但iowait分别为.5%和.6%,用户CPU使用率0.3%。分析后发现,iowait升高与磁盘读请求大相关,应用进程在进行直接磁盘I/O操作。

       为了解决iowait问题,首先使用dstat命令查看系统I/O情况,确认问题出在磁盘读操作。使用top命令定位到D状态的可疑进程,再通过pidstat命令获取进程详细信息,cfrez过代码源码发现app进程进行大量磁盘读操作,每秒读取MB数据。使用strace命令跟踪进程系统调用,发现app进程通过sys_read系统调用进行磁盘直接读取,绕过了系统缓存。

       为了解决直接读取磁盘的问题,修改应用源代码,删除O_DIRECT选项,避免直接磁盘I/O。运行修改后的代码,iowait降低至0.3%,问题得到解决。但僵尸进程问题依然存在,通过pstree命令找到僵尸进程的父进程,检查其源代码,发现wait函数错误地放在循环外部,导致无法正确回收子进程资源。修复wait函数调用位置,微博精灵源码确保每次循环都调用wait函数等待子进程结束。停止应用,重新运行修复后的代码,最终僵尸进程消失,iowait降至0,问题解决。

由Docker BUG引起的Linux宕机事故及解决办法

       1背景

       某运营商业务系统的服务器发生宕机,针对本次宕机事故进行排查。

       文章福利小编推荐自己的Linux内核源码交流群: 整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前名可进群领取,并额外赠送一份价值的内核资料包(含视频教程、电子书、实战项目及代码)!

       学习直通车: Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈

       2解决过程

       我们都知道kdump是在Linux系统崩溃、死锁、死机的时候用来转储内存运行参数的服务。系统崩溃后内核无法正常工作,这时kdump会产生一个用于capture当前运行信息的内核,将此时的内存中的所有运行状态和数据信息收集到vmcore文件中,收集完成后系统将自动重启。本次使用crash分析linux kdump日志。

       进入crash控制台

       PANIC为内核崩溃类型,这里是一个BUG,内核无法处理空指针

       在crash查看log,发现有很多Out-of-Memory

       通过bt查看系统崩溃前内核依次调用的一系列函数,查看内核在何处崩溃。以"# 数字"开头的行为调用堆栈:

       通过bt分析,可以定位到崩溃前的一个exception是ip寄存器RIP的异常,使用dis命令来看一下该地址的反汇编结果:

       从上面的反汇编结果中,我们看到问题出在ip6mr.c文件行代码,翻开linux源码的相应位置:

       撸内核源码 + Google

       通过走读Linux源码和Google,发现当系统创建新的namespaces时,会因为ip6mr_sk_done的值为空而引起系统混乱,从而导致内核无法正常分配内存,所以我们在log文件中看到了许多Out-of-Memory。

       在Kubernetes环境,提到namespaces就能想到docker,因为namespaces是docker的核心技术之一,容器的资源隔离由namespace来实现。

       通过检查docker的网络,发现其中一个子网为空

       解决办法

       内核配置加入"net.ipv6.conf.all.disable_ipv6 = 1",关闭 IPV6,防止触发 docker BUG;

       从内核的层面看,目前该Issue仍然没有close。在开启IPv6的环境,docker为什么会出现这个BUG,后续有空再研究,欢迎大家指正。

       3END

       Linux 内核虽然号称“不死族”,几乎不会崩溃或死机,但也有特殊情况,设备也有一定的使用周期,系统的高可用还是要的。

       虽然你单点运行服务时很帅,但是你处理故障时的样子真的很狼狈。

       往期精彩推荐:

       最新干货!使用eBPF LSM热修复Linux内核漏洞

       盘点那些Linux内核调试手段——内核打印

       Linux 环境下网络分析和抓包是怎么操作的?

       浅谈ARMLinux内核页表的块映射

       Linux性能观测之dstat命令详解

Linux性能观测之dstat命令详解

       dstat是一个强大的系统信息统计工具,集成了vmstat、iostat、netstat、nfsstat和ifstat的功能,能够全面观测Linux性能。

       要深入理解dstat,首先回顾其安装方式。请按照以下步骤操作:

       1. 打开终端。

       2. 使用命令 `sudo apt-get install dstat` 在Debian/Ubuntu系统上安装dstat,或使用 `yum install dstat` 在CentOS/RHEL系统上安装。

       3. 若遇到问题,可以参考社区资源或官方文档寻求解决方案。

       dstat的使用简单高效。它能以图形或文本形式提供系统性能指标,如CPU使用率、磁盘IO、网络I/O、分页活动和系统统计。以下是常用命令形式:

       - `total-cpu-usage`:查看CPU的总体使用情况。

       - `dsk/total`:展示磁盘IO的总情况。

       - `net/total`:显示网络I/O的总览。

       - `paging`:监测系统的分页活动。

       - `system`:收集系统统计信息。

       若需查阅更多dstat的英文说明或功能细节,可参考以下资源:

       - Linux manpage dstat

       此外,了解如何优化Linux性能和排查内存泄漏问题同样重要。我们整理了一些学习资料和书籍,欢迎加入我们的Linux内核源码交流群。前名加入的成员将获得免费的内核资料包,包含视频教程、电子书、实战项目及代码。加入时请使用真实信息,我们期待与您分享知识和经验。

       学习Linux内核源码的路径包括:内核源码解析、内存调优、文件系统、进程管理、设备驱动、网络协议栈等。

更多内容请点击【焦点】专栏

精彩资讯