DevOps故障排

Stella981
• 阅读 595

该书不在解决问的具体步骤,主要是解决问思路与方法。

第一章:故障排除的最佳实践
沟通,测试,尝试解决问题方案,记录问题和解决安案,了解改动,了解系统如何工作,谨慎使用internet,我到是觉得使用internet,抵制重启。

第二章:服务器为什么这么慢?耗尽了CPU、RAM和磁盘I/O资源
机器运行缓慢通常是由于消耗了太多的系统特定的资源,系统的主要资源包括CPU,RAM,磁盘IO,以及网络。这种问题一般通过重启能够解决,便需要工具确定引起问题的原因。
系统的负载:
uptime, 查看当前服务器运行了好长时间和服务器cpu(1分钟,5分钟,15分钟)的负载
14:55:57 up 63 days, 16:28,  3 users,  load average: 0.00, 0.00, 0.00
平均负载为1的单CPU系统意味着这个CPU处于恒定的负载,如果单CPU系统的负载是4,那么这个系统处于它可承受负载能力的4倍,所以3/4的进程都在等待资源。一个系统的平均负载不会因为你所拥有的CPU数量而改变,如果具备两个CPU的系统负载为1,那么其中一个CPU一直处于满负荷状态,也就是说系统处于50%的负载状态,所以负载为1的单CPU和负载为4的四CPU系统使用资源的量一样。
系统负载:1,CPU密集型(等待CPU资源的进程); 2,RAM密集型(尤其是频繁使用的RAM被移入交换区); 3,I/O密集型(还细分为磁盘I/O,网络I/O)。
top, 查看系统资源重要命令。默认按CPU使用排序。
top的第一行和uptime的基本一致。
top -b -n 1; top -b -n 1 > top_output; top -b -n 1 | tee top_output; -b 开启批处理 -n 刷新多少次。
按K后输入要终止的PID,最后系统会提示该进程将会终止于signal 15时,按Enter键确认即可。
Cpu(s):  1.5%us,  0.3%sy,  0.0%ni, 90.6%id,  7.6%wa,  0.0%hi,  0.0%si,  0.0%st
us:用户CPU时间; 指运行的用户进程所占CPU的时间的百分比。
sy:系统CPU时间; 指运行的内核和内核进程所占CPU的时间的百分比。
ni:优先级高的CPU时间; 如果更改过一些进程的优先级,这个指标能够告诉你它们所占CPU的时间的百分比。
id:CPU空闲时间; 这个是你希望具备很高的数值的席量的指示中的一个,它代表CPU的空闲时间比,如果系统运行缓慢,但是这个指标特的高,那么你就可以确定问题的原因不是高CPU负载。
wa:I/O等待; 这个数字代表了CPU时间用在等待执行I/O操作所占的百分比,当你解决运行缓慢的系统问题的时间,这是一个非常有度量的指标,如果这个数值很低,那么就能轻松排除磁盘或者网络I/O的问题。
hi:便件中断;cpu用于处理硬件中断所占时间的百分比。
si:软件中断;cpu用于处理件件中断所占时间的百分比。
st:流逝的时间;如果你运行虚拟机,这个度量指标会告诉你虚拟机中执行其它任务所占CPU时间的百分比。
看到相应的进程PID时可以进行下一步具体是什么原因进行确认。

解决高用户CPU时间问题
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
2445 qemu      20   0 3406m 1.1g 2900 S  1.9 14.1   6290:34 qemu-kvm
PID:进程号;
USER:用户;
PR:优先级;
NI:(nice值)负值表是优先级高,正值表优先级低;
RES:进程使用的、未被换出的物理内存大小,默认单位kb;
SHR:共享内存大小,默认单位kb;
S:进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程);
%CPU:表是CPU使有率;
%MEM:进程使用的物理内存百分比;
TIME+:进程使用的CPU时间总计,单位1/100秒;
COMMAND:执行的命令;

解决内存不足的问题
Mem:   7918524k total,  6995836k used,   922688k free,   562972k buffers
Swap:  8060920k total,   168092k used,  7892828k free,  3855032k cached
MEM相关:
total:内存总数:默认为kb可以使用top -M使其改成Mb
used:内存使用量
free:内存空余量
buffers:buffers区所占内存的大小
Swap相关:
total:swap分区总数
used:swap分区使用量
free:swap分区空余量
cached:cached占用量
在排除问题时这里需要注意一下
系统中可用内存需要将 内存使用量中减去 cached,这样得到的才是系统真的可使用的内存,这是因为linux默认的内存机制问题。
cat /proc/sys/vm/drop_caches
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
echo 0 > /proc/sys/vm/drop_caches
这样就会释放点cache,请小心使用。
To free pagecache:
* echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
* echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
* echo 3 > /proc/sys/vm/drop_caches
linux内核有一个内存耗尽终结者(OOM)安卓手机上有类似东西的体验非常明显特别是以前内存较小的(256M)时代。
当系统内存快要耗尽时,OOM终结者就会开始终止进程,有些情况下,会终止占用大量RAM的进程,但它并不能保证不会杀死未占用大占内存RAM进程,有时会终止像sshd这样的程序而不是真正的罪魁祸首。

解决高I/O等待时间问题
iostat
Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              77.63      1580.80       518.20 8704900813 2853532512
dm-0             89.96      1580.69       518.06 8704332655 2852784412
dm-1              0.03         0.10         0.14     542320     748008
iostat -dmx
Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.02    12.44   39.13   38.51     0.77     0.25    27.04     0.44    5.62   2.56  19.85
dm-0              0.00     0.00   39.13   50.83     0.77     0.25    23.33     0.61    6.76   2.21  19.86
dm-1              0.00     0.00    0.01    0.02     0.00     0.00     8.00     0.00   55.48   0.89   0.00
tps:这个值列出了设备每秒的传输量,“传输”Transfer是向设备发送I/O请求的另一种表达方式。
Blk_read/s:每秒向设备的读取数据量。
Blk_wrtn/s:每秒向设备的写入数据量。
Blk_read:向设备读取数据的总量。
Blk_wrtn:向设备写入数据的总量。
rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge)
wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
r/s:每秒读取的扇区数。
w/s:每秒写入的扇区数。
rMB/s:每秒读取的M数。
wMB/s:每秒写入的M数。
avgrq-sz:平均请求扇区的大小。
avgqu-sz:是平均请求队列的长度。毫无疑问,队列长度越短越好。
await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
svctm:表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。
%util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
还有类似命令:iotop

sysstat介绍:
sar -s 05:00:00 -e 70:30:00
sar -f /var/log/sa/sa06

第三章:为什么系统无法启动?解决启动问题
(1)linux启动流程
(2)BIOS
(3)GRUB2 MBR
GRUB2配置文件/etc/default/grub,实际配置文件为/boot/grub/grub.cfg,但这个文件通常有脚本生成,所以修改了/etc/default/grub 后要运行/usr/sbin/update-grub这个脚本生成新的grub.cfg文件,如果手动修改/boot/grub/grub.cfg需要按照grub2的脚本语法来。
如果需要在MBR重新安装GRUB2,/sbin/grub-install /dev/sda 这里的sda需要替换成你的根分区设备,可以df 那个设备是/mnt/sysimage或者查看/boot/grub/grub.conf文件。如果是恢复光盘那么使用linux rescue启动选项启动系统,在执行前应该执行 chroot /mnt/sysimage挂载根分区。
GRUB启动内核传参有root=/dev/sda2; root=LABEL=/ ;或者root=UUID=234d3f83-34fe-3f44-h434-98df3f8f82f2这样的字符串,第一种方式在老式系统中常见,现在系统中一般使用了UUID,当新增加一块硬盘时之前的/dev/sda2可能变成了/dev/sdb2.相要解决设备名称更改的问题,所以引入了标识如把根分区可能用/或者root来标识,/home分区可能用home或者/home来标识,GRUB不使用root=这行来指定设备,而使用标识(如root=LABEL=/)来指定,就算更改了实际设备名称标签不会变,系统内容还是会找到根分区的。标签用来解决设备名称更改问题,但引入了一个新的问题,当两个标签相同时,如果新增的硬盘有自己的/和root标签,那么内核可能无法挂载你想要的标签,这样一些系统引入了UUID(通用唯一标识符)即root=UUID=234d3f83-34fe-3f44-h434-98df3f8f82f2。这里还有三个地方需要注意,一个是/etc/fstab,一个是e2label /dev/sda2 /这样给那个分区一个标签,另一个是blkid -s UUID /dev/sda2 查看待定分区的UUID值。有了这些就可以合理修改GRUB的启动配置。
(4)内核与初始化RAM磁盘
GRUB载入linux核心时会传入启动时配置的所有参数,通常GRUB也会随着内核载入一个初始RAM磁盘(Initial RAM Disk, Initrd),在现代linux系统中它通常是一个gzip格式压缩的备份文档,称为initramfs文件,一般包含一个基本的小型linux根文件系统,在这个文件系统中,有一些重要的配置文件,内核模块以及内核需要用来寻找并挂载真实的根文件系统的程序。
以前启动时的这些功能都直接构建在linux的内核中,但是随着硬件的开始支持很多不同的文件系统以及SCSI和IDE设,并带有一些额外特性(如RAID,LVM),内核变得越来越大。因此,这些特性被分拆到独立的模块中,这样就可以仅仅载入系统所需要的模块,因为硬件驱动器和文件系统支持都分拆到了模块中,所以你会面临鸡和蛋的问题,如果模块处于根文件系统中,而你又需要用这些模块来读取根文件系统,怎么才能完成持载?解决方法是把这些重要模块都放入初始化RAM磁盘中。
随着内核的启动,它会将initramfs文件解压到RAM中,然后利用initramfs文件的根目录中运行一段名为init的脚本,这仅仅是一个标准的shell,用来先检测硬件,然后创建挂载点,之后再挂载根文件系统,因为这个路径是由GRUB在它首次加载时传入的一个启动参数(root=),所以系统内核知道根文件系统在哪里。在挂载了真正的根文件系统之后,initramfs文件的最后一步是执行/sbin/init程序,后者会接管启动流程中的其它工作。
/sbin/init(System V Init)新的systemd另外再找资料
init有0-6共7个等级,会先读取/etc/inittab文件确定进入那个等级,一般0关机,1为单用户,6重启,是init定义好的,2-5为发行版使用,3一般为文本模式多用户,5为图形模式多用户。
/etc/init.d 该文件夹包含所有服务在各个运行等级中的全部启动脚本,一般说来都是标准shell,最少接收start和stop两个参数,有些还提供restart,status,reload,force-reload等。
/etc/rc0.d - /etc/rc6.d 这些文件夹包含每个运行等级的对应的init脚本,实际使用中一般都是通过符号链接到/etc/init.d文件夹下的实际文件,命名都是以S(start),K(kill)或D(disable)开头,后面跟一个数字。当init进入一个运行等级的时候,它会按照数字顺序运行以K开头的脚本并传入stop参数,除非对应的init脚本在前一个运行等级中没有启动。然后init按照数字顺序运行所有以S开头的脚本并传入start参数,任何以D开头的init脚本都会被忽略--这可以让你指定的等级禁止一个脚本。资料上还提到了/etc/rcS.d/该文件夹不过在centos6.5上是没有,不过有rc.sysinit脚本。最后系统一般会在init结束的时候运行rc.local脚本,所以要想启动点东西时可以来改这个文件。

第四章:为什么磁盘无法写入?解决磁盘满或者磁盘损坏的问题
(1)磁盘满或者节点不足
最常见到问题是无法写入,如copy文件报没有空间等,我们可以使用df -h,来查看所有分区大小,已使用空间,可用空间,查看占用空间最大的,du -sh *;或者du -cmx * ;来查看当前文件夹下各个文件所占用的大小,du -cmx |sort -n 下也许更好。
查看节点问题,我刚工作时就遇上过空间还有多许,就是没有节点了,无法创建文件。df -i 来看节点使用信息,
(2)文件系统只读
文件系统挂载时就是只读挂,使用mount -o remount,rw /home这种情况很少见,因为挂载好的一般不会动他。
(3)修复损坏的文件系统
这里介始fsck -y -C /dev/sda5,这步操作前需要umount有的为unmount。 mke2fs -n /dev/sda5这来查看该文件系统上所有的超级块,一但看到超级块就选择其中一个,然后将它作为fsck命令-b选项的参数:fsck -b 8193 -y -C /dev/sda5。这样会在完成后自动更新主超级块。
(4)修复软RAID
查看cat /proc/mdstat,移除mdadm /dev/md0 --remove /dev/sdd1。mdadm /dev/md0 --fail /dev/sdd1,将md0中的/dev/sdd1区分设置为缺陷,把新硬盘插入后分区搞定的,mdadm /dev/md0 -add /dev/sdd1。mdadm会自动开始同步数据,查看过程用cat /proc/mdstat。想连续查看watch -n 5 "cat /proc/mdstat"。

第五章:服务器宕机了?追踪网络问题的根源
ethtool eth0,查看eth0设备的状态,ethtool -s eth0 autoneg duplex full 。ifconfig eth0查看eth0接口信息,route -n查看路由表,网络设置/etc/sysconfig/network-scripts/ifcfg- 以及debian的 /etc/network/interfaces文件。service network restart;service networking restart;ping 192.168.1.254网关。arp -a 查看arp信息。nslookup或者dig来检查dns。DNS配置,一种是在接口文件中直接配DNS1=8.8.8.8,常规的是在/etc/resolv.conf文件nameserver 61.128.128.68即可。查看到对端网络连接性traceroute 8.8.8.8到它走了那些路由节点,如果某个限制了icmp数据包,我们可以使用TCPtraceroute,使用方法与traceroute一样。查看对方端口:telnet 10.1.2.5 80即可,nmap也是常用工具nmap -p 80 10.1.2.5;查看本机端口netstat -lnp |grep 80; isof -i:80; iftop,抓包工具:tcpdump ,wireshark抓包分析
tcpdump
本机到web1主机的所有通信:tcpdump -n host web1;本机不是到web1的所有通信:tcpdump -n not host web1;所有指定端口的流量:tcpdump -n prot 53; tcpdump -n 80 or port 443; tcpdump -n host web1 > host-web1.outfile;tcpdump -n host web1 |tee host-web1.outfile; 原始数据包转储:tcpdump -w output.pcap ;-C指定输出文件大小 tcpdump -C 10 -w output.pcap ;这样会10M为一个文件,-W 指定最多创建多少个卷,写满最后一个后回覆盖第一个文件:tcpdump -C 10 -W 5 -w output.pcap; 一但获得数据包,我们可以使用-r选项进行数据包实时重播: tcpdump -n -r output.pcap

第六章:为什么主机名无法解析?解决DNS服务器的问题

第七章:为什么无法收发邮件?追踪邮件问题

第八章:网站宕机了?追踪Web服务器问题

第九章:为什么数据库这么慢?追踪数据库问题

第十章:这是硬件问题,诊断常见的硬件问题
硬盘:smartmontools工具包,检测硬盘:smartctl -H /dev/sda,smartctl -a /dev/sda; 内存:Memtest86+,一般在安装系统时都会有这个提示可以检测一下。网络:ifconfig eth0吧,温度:lm-sensors工具包,先使用sensors-detect分析系统便件,使用sensor来获取服务器数据。

常用工具命令汇总:

ps -A -opid,stime,etime,args
nmap
tcpdump

lsof
strace
pstack

nslookup
dig

sar
mpstat
iostat
vmstat
pidstat
iftop
ethtool
route
ping
traceroute
tcptraceroute
ifconfig
ip add
ip route
curl
wget
telnet

nc
ss

扫描工具
Unicornscan
Zenmap
nast
Knocker

漏扫工具
openvas
Nessus
lynis
Nexpose

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这