文章目录
- 1.排查思路
- 1.cpu
- 2.内存
- 3.磁盘io
- 4.网络
- 5.系统负载
- 6.GC问题
- 7.日志的查看
- 8.dd 与fio命令
1.排查思路
- 大数据集群运行在linux系统上,基本从以下几个方面入手:cpu,内存,磁盘IO,网络,GC等
1.cpu
- 一些概念:多核,超线程(一个核一个线程,还是一个核开多个线程),CPU频率(2.2GHZ)
- cpu模式:节能模式,普通模式,超能模式,bios里面设置,大集群要注意这个参数,尽量关闭节能模式。
- 查看物理CPU个数
cat /proc/cpuinfo|grep "physical id"|sort|uniq|wc -l
- 查看逻辑cpu个数
cat /proc/cpuinfo|grep "processor"|wc -l
- eg:
- 查看cpu多少核
- 通过top来查看cpu的使用率来判断系统的负载情况:top,然后按下1,可以看到cpu的使用率
2.内存
- 清屏:
ctrl l
- 常见内存大小是64G,128G,256G,512G,通过free -g来查看系统内存是否不足
- 查看内存的详细信息:
cat /proc/meminfo
3.磁盘io
- 磁盘种类:sata(150M/s左右),sas(300M/s左右),ssd(最快也最贵)
一般磁盘2T-4T,服务器支持的最大存储也不同,比较常见的48T,一般服务器可以支持12-24块盘。 - 磁盘io的查看
iostat指令的说明:iostat用于输出CPU和磁盘I/O相关的统计信息
每隔2s
iostat -mx 2
这里我们用了两个参数
-k 以 KB 为单位显示
-m 以 M 为单位显示
如果不带这些参数的话, 则会用 Blk。 Blk列是512字节块。
如果要细化到看那个进程的 io 消耗大, 可以用 iotop 命令查看。
使用pidstat查看进程使用磁盘的情况:pidstat -d 1
iotop:利用iotop查看到底是哪个进程耗io
显示所有线程 -a:iotop -a
其他:iotop -oPa
-o, --only 只显示正在产生I/O的进程或线程。除了传参,可以在运行过程中按o生效。
-P, --processes 仅显示进程,默认iotop显示所有线程
- 主要看最后一列,若svctm数值很大,说明磁盘打满了,说明程序运行会应该很慢
iotop: - sar命令
[root@server-68.2.stage.polex.io var ]$ sar -d -p 1 2
Linux 3.10.0-693.5.2.el7.x86_64 (server-68) 03/11/2019 _x86_64_ (64 CPU)
02:28:54 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
02:28:55 PM sda 1.00 0.00 3.00 3.00 0.01 9.00 9.00 0.90
02:28:55 PM sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:28:55 PM polex_pv-rootvol 1.00 0.00 3.00 3.00 0.01 9.00 9.00 0.90
02:28:55 PM polex_pv-varvol 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:28:55 PM polex_pv-homevol 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 其中, “-d”参数代表查看磁盘性能,“-p”参数代表将 dev 设备按照 sda,sdb……名称显示,“1”代表每隔1s采取一次数值,“2”代表总共采取2次数值。
- await:平均每次设备 I/O 操作的等待时间(以毫秒为单位)。
- svctm:平均每次设备 I/O 操作的服务时间(以毫秒为单位)。
- %util:一秒中有百分之几的时间用于 I/O 操作。
- 对于磁盘 IO 性能,一般有如下评判标准:
(1)正常情况下 svctm 应该是小于 await 值的,而 svctm 的大小和磁盘性能有关,CPU 、内存的负荷也会对 svctm 值造成影响,过多的请求也会间接的导致 svctm 值的增加。
(2)await 值的大小一般取决与 svctm 的值和 I/O 队列长度以 及I/O 请求模式,如果 svctm 的值与 await 很接近,表示几乎没有 I/O 等待,磁盘性能很好;
如果 await 的值远高于 svctm 的值,则表示 I/O 队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。 - %util 项的值也是衡量磁盘 I/O 的一个重要指标,如果 %util 接近 100% ,表示磁盘产生的 I/O 请求太多,I/O 系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去,势必影响系统的性能,可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题
参考:磁盘IO的性能指标,Linux查看某个进程的磁盘IO读写情况 pidstat,利用iotop查看到底是哪个进程耗io,Linux如何查看与测试磁盘IO性能
- 查看磁盘空间
df -h
- 查看磁盘的格式化的格式,主流一般是xfs和ext4,系统盘默认是xfs,后续添加的数据盘尽量也是xfs这样统一比较好,也方便写脚本批量挂载。
df -T
cat /etc/fstab
- lsblk能够查看与分区以及ssd盘,用fdisk查看盘可能识别不到ssd
- 查看磁盘与未挂载的磁盘和分区信息
fdisk -l
- cat /etc/fstab查看磁盘挂载信息,新加磁盘要手动永久挂载需要在这个配置文件里添加6列。
这6列的含义:
盘符名 挂载目录 磁盘格式 defaults 0 0
新加一个盘,永久挂载需要修改/etc/fstab里面的信息
vim /etc/fstab
- lvm:逻辑卷,扩容及缩容基本都是基于LVM进行操作的
(1)PV:物理卷:硬盘和分区
(2)VG:卷组,多个PV
(3)LV:逻辑卷,多个VG
fdisk -l
- 实际需求应用:
(1)集群磁盘扩容加盘,要永久挂载 (信息要写入/etc/fstab)
(2)根目录空间不够,要给根目录扩容 (lvm)
- 磁盘阵列(bios里设置)常见
(1)raid0(无冗余,一般用作数据盘)
(2)raid1(双备份,一般作为系统盘)
(3)raid5(n-1/n,损失其中一块盘的空间)等等
4.网络
- (1)查看是否ping通:ping ip
- (2)查看某端口是否被监听
eg:你启动datanode没有启动,查看日志报错:address in used,翻译过来就是端口被占用,那得查看下这个端口映被哪个程序占用了,就用netstat -anp|grep 端口号,就可以知道它的进程,比如下图进程pid就是107484,就可以用kill -9 强制杀死 - 网卡模式配置(bond6,负载均衡)
(1)修改方法
BONDING_OPTS=“miimon mode=1”(配置Bond的核心语句,mod1为主备模式)
ifcfg.bond0文件的配置
(2)网卡Bond是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,通过Bond技术让多块网卡看起来是一个单独的以太网接口设备并具备相同的ip地址
mod0 平衡轮循环策略
mod1 主备份策略
mod2 平衡策略
mod3 广播策略
mod4 IEEE 802.3ad动态链路聚合
mod5 适配器传输负载均衡
mod6 适配器适应性负载均衡
5.系统负载
- Linux指令
top
uptime
w
cat /proc/loadavg
6.GC问题
- 是否full GC(GC是java里面jvm的东西),jps查出要查看的pid,用jstat -gcutil pid,看第四列O,如果100%,就是fullGC
(1)下面的O表示的就是fullGC,若比较高,则需要去优化软件程序
7.日志的查看
- 首先要知道日志的位置,一种是去配置文件查看有没有配置相关位置,一种是去通过进程查看如下,用ps -ef|grep pid通过显示出来的信息可以找到日志的位置
- eg:查看某个进程日志的位置
- 查看日志
(1)实时查看日志文件后100行,tail -f -n 100 file
(2)静态查看:vim filelog,然后通过关键字error/warn等查找错误
8.dd 与fio命令
- Linux dd 命令用于读取、转换并输出数据。dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。
- 我们可以利用 dd 命令的复制功能,测试某个磁盘的 IO 性能,须要注意的是 dd 命令只能大致测出磁盘的 IO 性能,不是非常准确。
- 测试写性能命令:
[root@server-68.2.stage.polex.io var ]$ time dd if=/dev/zero of=test.file bs=1G count=2 oflag=direct
2+0 records in
2+0 records out
2147483648 bytes (2.1 GB) copied, 13.5487 s, 159 MB/s
real 0m13.556s
user 0m0.000s
sys 0m0.888s
可以看到,该分区磁盘写入速率为 159M/s,其中:
/dev/zero 伪设备,会产生空字符流,对它不会产生 IO 。
if 参数用来指定 dd 命令读取的文件。
of 参数用来指定 dd 命令写入的文件。
bs 参数代表每次写入的块的大小。
count 参数用来指定写入的块的个数。
offlag=direc 参数测试 IO 时必须指定,代表直接写如磁盘,不使用 cache 。
- 测试读性能命令:
[root@server-68.2.stage.polex.io var ]$ dd if=test.file of=/dev/null iflag=direct
4194304+0 records in
4194304+0 records out
2147483648 bytes (2.1 GB) copied, 4.87976 s, 440 MB/s
可以看到,该分区的读取速率为 440MB/s
- fio 命令
fio 命令是专门测试 iops 的命令,比 dd 命令准确,fio 命令的参数很多,这里举几个例子供大家参考:
顺序读:
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r
顺序写:
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_w
随机写:
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_randw
混合随机读写:
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r_w -ioscheduler=noop