共计 2099 个字符,预计需要花费 6 分钟才能阅读完成。
xin 片之争,已经暴露了中国 xin 的问题,我等码农束手无策;而在操作系统方面,成果也是乏善可陈;现如今酷炫的 Web 监控工具,让很多研发丧失了真正处理问题的能力。
越接近底层,就越接近真相,在计算机的世界,同样适用。
我们的目的,就像是《荒岛余生》一样:找到一个信念,在最残酷的环境中,生存下去。说的比较隐晦,其实就是:你换公司了,而你的新公司比较推崇 devops,你要自己面对问题。
吹的那么高大上,一副拯救世界的感觉,但本系列的文章知识并不深,很多已经在大学里的操作系统见过了,虽然照读课本的叫兽并不能让你勾起丝毫兴趣。
如果本系列能够勾起你的些许兴趣,就算目的达到了。本来是想要聊仔细点,但由于时间有限,又不是写书,原理性的东西就不多说了。
内容
文章将会尝试单纯的 Cpu、Mem、Net、Disk、IO 问题排查,然后组合各种元素,解决一些棘手问题,就是一些常用命令的组合。当然我们是 java 系的,所以会多一些 java 方面的讨论。如果你不了解行文风格,可以先读读:《Java 堆外内存排查小结 – 小姐姐味道》
为什么 Linux 系统会出现这样那样的问题呢?主要的原因就是计算机的各个部件的速度不均衡。Cpu 在等 cache line,cache 在等内存,内存在等设备。就像在连续 17 公里高速下坡路口设个收费站一样,一不小心就车毁人亡。
设备五花八门,通常我们接触的设备,就是硬盘和网卡。整个业务系统和操作系统充斥着各种各样的缓冲区,CPU 要通过中断负责他们之间的协调。这样,会有很多地方会发生 bottleneck。
监控值
排查问题也是有过程的。通常,关注一个硬件资源,比如 CPU,我们关注以下基本要素:1) 利用率 一般是瞬时值,属于采样范围,用来判断有没有峰值。比如 cpu utilization2) 饱和度 一般指资源已完全使用,新请求在特定 queue 里排队。比如 cpu load 过高 3) 错误信息 硬件或者驱动错误,比如 dmesg 命令显示的 OOM4) 联想信息 对引起的原因进行猜测,并用更多的工具验证猜想。比如系统响应慢猜测大量用到了 swap
原因
监控值只是一种表象,具体引起的原因才是重点。我们通常希望纯粹的资源限制所引起的故障,这种问题都比较好定位。大多数情况下都没那么幸运,所以广度上的信息共享能帮助很多。过程如下:
1) 信息收集 问题起始时间,上下文 2) 改动集合 问题发生前所有变更列表 3) 问题抽象 将描述抽象成具体的资源问题 4) 问题排查 将信息整理完毕,就可以进行真正的荒野之旅了
测试
本测试用来决定你是不是本文目标受众,如果无法回答以下问题,建议先看一点基本的 Linux 知识,这将会节省你的时间,因为文章不会对此提太多。
io wait 是什么意思?
swap 是什么分区,怎么关闭?
/tmp 目录有什么特殊性?
管道是什么东东?
Linux 发行版
接下来热热身,瞧瞧 Linux 有什么发行版。
我这里挑选了 6 个代表性的版本,版本聚焦的功能向专业化和个性化发展。其中,Centos 作为最常见的服务器版本,占据了大量的市场份额;Ubuntu 在 GUI 和易用性上赢得了桌面用户;Kali 代表了向专业化发展的一个分支。
个人使用时间最长的是 archlinux,尤其喜欢它的滚动升级功能。但由于 Centos 在服务器端的市场份额实在太大,我们以下的讨论都基于 Centos。
据不完全统计,已经有上千个 linux 版本,见下图(高清大图见 https://distrowatch.com/image…)。你来告诉我,红旗、麒麟的位置在哪里。
将常用脚本加入到 PATH 中
有些命令组合不好记,频繁输入也觉得烦,可以将这些过程整理成脚本,扔到 path 中。
还记得第一次安装 jdk,添加的环境变量么?Linux 和它类似,不过它有多种 shell。
通常我们用的叫 bash,平常说的 shell 脚本就是 bash 脚本。但也有很多其他好用的 shell,比如 csh、ksh、zsh 等。
查看 /etc/shells 文件看一下你安装过的 shell
[root@localhost ~]$ cat /etc/shells
/bin/sh
/bin/bash
/bin/zsh
/sbin/nologin
/bin/dash
在个人领域,zsh 配合 oh-my-zsh(推荐)达到最佳,但服务器一般不会去改你的 shell,通过一个环境变量,能够看到你当前所使用的 shell 终端。
[root@localhost ~]$ echo $SHELL
/bin/bash
针对于 bash,我们的配置就在用户目录下的.bashrc 文件中。
在用户目录下创建.bin 目录
mkdir ~/.bin
将目录加入到环境变量 PATH 中
echo “export PATH=\$PATH:~/.bin/” >> ~/.bashrc
在.bin 创建一个文件 xjj,内容为 echo “pleasant taste”
cat > ~/.bin/xjj <<EOF
echo “pleasant taste”
EOF
给 xjj 增加可执行权限
chmod a+x ~/.bin/xjj
这样,使用你的用户,在任何地方,都可以执行 xjj 了
[root@localhost ~]$ xjj
pleasant taste
真是令人愉悦的味道~