线程池

七大参数:

  • 核心线程数量大小

  • 最大线程数量大小

  • 等待时间

  • 等待时间单位

  • 阻塞队列

    ArrayBlockingQueue(基于数组),LinkedBlockingQueue(基于链表,无界队列,可传入参数构建有界队列),PriorityBlockingQueue(支持优先级的无界阻塞队列,因为是无界,所以put不会阻塞)

  • 构建工厂 一般都是默认

  • 拒绝策略(四大策略

    满了就抛异常(默认),满了就不管,满了就抛弃队列最早的,满了就由调用该方法的线程去执行

为什么不用Excutor创建线程?

Excutor是创建线程池的工具类,有四个

  • SingleThreadPool
  • FixedThreadPool
  • CacheThreadPool
  • ScheduleThreadPool

前两个是会创建固定的线程数,但是阻塞队列是无边界的,会导致请求的堆积,最终OOM

后两个会创建Integer.MAX_VALUE个线程,导致OOM

向线程池添加任务后线程池的处理逻辑

  1. 首先判断当前线程池任务量有没有达到核心线程数大小,没有达到就创建线程来执行任务
  2. 到达了,就看阻塞队列满没满,没满就放到阻塞队列里
  3. 满了,就判断当前线程数是不是达到最大线程数,没有就创建线程去执行
  4. 达到最大线程数了,那就要执行拒绝策略了

HashMap老八股文

底层数据结构?

JDK1.7 数组+链表 —>JDK1.8数组+链表+红黑树

头插法—>尾插法

头插法在单线程下不会让链表变成环状,多线程下可能会发生节点的互相引用,造成链表的环状,以至于再get()时会发生死循环

尾插法就不会,但这并不是HashMap的BUG,因为HashMap并不是线程安全的,要在多线程环境下就用ConcurentMap

转红黑树的条件?

链表长度大于8并且桶的大小达到64才会转红黑树,即使链表长度大于8,桶的大小未达到64,是先扩容的

put()操作

1.获取hash,扰动函数,高16位&低16位,更加散列,减少hash碰撞

2.寻址算法:hash&bin.length-1,找到桶的位置

3.hashmap是懒加载机制,用到才会初始化,所以第一步是检查hashmao有不有初始化,没有就先初始化,默认16

4.已经初始化的hashmap,下面就是put的操作了,当找到的桶的位置为空,那就直接放上去即可

5.桶的位置不为空,桶的第一个元素与插入的key一样,那就进行替换操作(用==或者equals())

6.当前已经树化了,创造树型节点插入红黑树中,这个我就不深究了,红黑树还是难

7.当前已经链化了,那就next,一个一个找,一个一个equals()去比较,直到最后也没发现相同的key,那就直接把Node放在链表尾部,也就是尾插法,判断链表长度是否大于 8, 大于的话链表转换为红黑树

8.++size,如果++size()>扩容阈值,就立即进行resize()

get()操作

1.如果链表为空或者对应桶为是空的,那就直接返回null

2.如果不为空,并且桶的头元素就是要找的key,那就直接返回value

3.桶已经树化了,就在红黑树上找

4.桶已经链化了,就在链表上找,找到就直接返回,到最后也没找到,就直接返回null

resize()操作

  1. 如果链表已经到底Integer.MAX_VALUE,就不再进行扩容了

  2. 否则就翻倍扩容*2

    rehash()

  3. 现在就要进行数组的迁移操作了,头节点不为空,就把当前桶位置为空

  4. 当前桶只有一个原始,直接进行寻址算法,找到新的桶位置

  5. 已经树化了,也是重新找桶的位置

  6. 已经链化了,就分高位链表和低位链表,低位链表存放在扩容之后的数组下标的位置,与当前数组下标位置一致的元素,高位链表存放在扩容之后的数组下标的位置为当前数组下标位置+ 扩容之前数组长度的元素,进行链表的拼接

如果是一个Object作为hashMap的key的话这个对象需要满足什么条件?

Hashmap不允许有重复的key,所以要重写它的hashcode和equals方法,以便确认key是否重复。重写hashCode()是因为需要计算存储数据的存储位置,重写equals()方法目的是为了保证key在哈希表中的唯一性

红黑树查找和插入时间复杂度

查找和插入都是O(logN)

ConcurrentHashMap老八股文

线程安全的HashMap

底层数据结构?

JDK1.7 Segment+HashEntry分段锁实现

JDK1.8抛弃Segment,采用CAS+Sync+数组+链表+红黑树,

详细讲解分段锁吧

Segment继承于ReentrantLock,Segment则包含HashEntry的数组,HashEntry本身就是⼀个链表的结构,具有保存key、value的能⼒能指向下⼀个节点的指针。

Segment就是HashMap,默认是16个,也就是说支持16个线程的并发写,Segment之间相互不受到影响,每一段都使用分段锁,当一个线程占用锁访问其中一段数据时,其他端数据也能被其他线程访问。

get()会加锁吗?(JDK1.7)

不会,通过Key定位到Segment,再遍历链表上的元素,获取到的value是volatile的,所以get是不需要加锁的

put()操作?

1.和hashmap类锁,先通过计算hash,定位到Segment,如果当前Segment是空的,就初始化

2.使用ReentrantLock加锁,如果尝试获取锁失败就尝试自选,如果自旋锁超过一定次数就阻塞,保证一定能获取到锁

3.遍历HashEntry,和HashMap一样,有就替换,没有就加上

JDK1.8中具体怎么实现ConcurrentHashMap再说详细点

采用CAS+Syn来保证并发的线程安全,put时,通过hash计算数组位置,若为空,就通过CAS操作直接添加。若不为空就Sync加锁,进行添加操作。Sync之锁定当前链表或红黑树的首节点,只要Hash不冲突,就不会产生并发,效率大大提示

get没有进行同步操作,支持不并发操作

说说为什么1.8抛弃了1.7的分段锁吧

  1. Segment继承自ReentrantLock,有了锁的功能,是分段的,当Segment越来越大,锁的粒度也越来越大
  2. 分段锁优势在于操作不同的Segment是并发的,不需要锁,操作同一个Segment是需要锁的,相对于对整个map加锁是有优势的
  3. 缺点在于分成很多段是会比较浪费内存空间(不连续,碎片化);操作map时竞争同一个分段锁的概率非常小时,分段锁反而会造成更新等操作的长时间等待; 当某个段很大时,分段锁的性能会下降。

为什么不用ReentrantLock而用Sync?

  1. 减少内存开销:如果使用ReentrantLock则需要节点继承AQS来获得同步支持,增加内存开销,而1.8中只有头节点需要进行同步。
  2. 内部优化:synchronized则是JVM直接支持的,JVM能够在运行时作出相应的优化措施:锁粗化、锁消除、锁自旋等等。

SQL优化

这个基本上也是必问的一道题,先说思路和维度

  • 分析语句,是否加载了不必要的字段和数据
  • 分析SQL执行计划,是否命中索引?这时候可以讲讲适合创建索引的字段,索引失效的情况,
  • 如果SQL很复杂,优化SQL结构
  • 如果单表数据数据量过大,可以考虑分表?水平分表?hash或者range

1. 优化表结构

  • 尽量使用数字型字段

    若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符型,而对数字型只需要一次比较即可

  • 能用char就用char,存取更快(会问char和varchar的区别,char是固定长度,英文1个字节,中文2个字节,varchar是变长的,中英文都是2个字节)

  • 当索引列出现大量重复数据,离散性不好,比如性别,状态等,就需要删掉索引

2. 优化查询

适合创建索引的列

  1. 主键(默认就是聚簇索引)
  2. 经常查
  3. 非空
  4. 需要order by,group by
  5. 非空、唯一
  6. 经常范围查询

不适合创建索引的列

  1. 很少查询的列
  2. 定义为text,bit,image的数据类型
  3. 有null的
  4. 修改性能远远大于检索时,不应该创建索引

索引失效的情况

  1. where中存在函数类型转换,比如select * from news where year(publish_time) < 2017
  2. 遇到null
  3. != ,not in ,not exits会走索引,in也不一定都会走索引,假如in中的集合包含了很多数据,innodb判断性能还不如直接扫表,那就不会走索引了
  4. like,对于where filed like ‘%luffy%’,不会走索引,但where filed like ‘luffy%’会走索引,取决于%的位置
  5. 遇到运行 比如where id * 3 = 100,不会走,可以优化成where id = 100 / 3

需要注意覆盖查询,防止回表查询。复合索引符合最左前缀原则

3.优化索引

  • 对作为查询条件和order by的字段建立索引
  • 避免过多的建立索引,多使用组合索引

接下是个重头戏了,分析执行计划Expain SQL

  1. id 查询的序号
  2. select_type 简单查询还是复杂查询
  3. table 在哪个表上进行操作
  4. type 最重要的一个参考之一,表示关联类型或者访问类型,即返回MySql决定如何查找表中的数据。从最优到最差分别为:system—>const—>eq_ref—> ref—> fulltext—> ref_or_null—> index_merge—> unique_subquery—> index_subquery—> range—> index—>All
  5. pussible_keys 显示查询可能使用哪些索引来查询
  6. key 实际采用了哪个索引
  7. key_len 显示mysql在索引中使用的字节数,通过这个值可以算出具体使用了索引中的哪些列
  8. ref 显示了在key列记录的索引中,表查找值所用到的列或常量。常见的有:const(常量)、func,NULL,字段名
  9. rows mysql估计要读取并检测的行数,不是结果集的行数
  10. Extra 显示额外信息,Using index,Using where,Using temporary等

Linux常用命令

这个东西这没啥好说的,多敲就行,但一段时间不用,基本上全忘了,面试也会问开发环境,那就一定要说下Linux,毕竟企业部署都是在Linux上,这里也只是说下Java工程师常用命令,多的感觉没必要去记,用到去查就是

切换root用户

1
sudo -i

文件常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
~~ 新建文件夹
[root@centos7-luffy ~]# mkdir /root/testLinux
~~ 进入文件夹
[root@centos7-luffy ~]# cd testLinux/
~~ 显示当前文件夹内的文件信息
[root@centos7-luffy testLinux]# ls
~~ 打印当前路径
[root@centos7-luffy testLinux]# pwd
/root/testLinux
~~ 平铺文件信息
[root@centos7-luffy testLinux]# ll
总用量 0
~~ 创建文件,若文件存在就更新文件访问时间和修改时间
[root@centos7-luffy testLinux]# touch a.txt
~~ 编辑文件
[root@centos7-luffy testLinux]# vim a.txt
~~ 预览文件
[root@centos7-luffy testLinux]# cat a.txt
"I love Linux"
~~ 显示文件前10行
[root@centos7-luffy testLinux]# head -10 a.txt
"I love Linux"
~~ 显示文件后10行
[root@centos7-luffy testLinux]# tail -10 a.txt
"I love Linux"
~~ 把数据写入文件
[root@centos7-luffy testLinux]# echo "wdnmd" >> a.txt
[root@centos7-luffy testLinux]# cat a.txt
"I love Linux"
wdnmd
[root@centos7-luffy testLinux]# cd ../
[root@centos7-luffy ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg msql mysql temp test testLinux 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@centos7-luffy ~]# cd test
[root@centos7-luffy test]# ls
b.txt
~~ 删除文件 -f 强制删除,不用确认 rm -r 文件夹名字,用来删除文件夹
[root@centos7-luffy test]# rm -f b.txt
[root@centos7-luffy test]# cd ../testLinux/
[root@centos7-luffy testLinux]# ls
a.txt
~~ 复制文件 cp 文件 复制到的路径
[root@centos7-luffy testLinux]# cp a.txt /root/test
[root@centos7-luffy testLinux]# cd /root/test
[root@centos7-luffy test]# ls
a.txt
[root@centos7-luffy test]# cat a.txt
"I love Linux"
wdnmd
~~ 移动文件 可以用来重命名哟 mv 指定文件路径 目标文件路径
[root@centos7-luffy test]# mv a.txt rename.txt
[root@centos7-luffy test]# ls
rename.txt
[root@centos7-luffy test]# mv rename.txt /root/testLinux/
[root@centos7-luffy test]# ls
[root@centos7-luffy test]# cd ../testLinux/
[root@centos7-luffy testLinux]# ls
a.txt rename.txt
[root@centos7-luffy testLinux]# cat rename.txt
"I love Linux"
wdnmd
~~ 重启系统
[root@centos7-luffy testLinux]# reboot
~~ 传了个压缩包到该文件夹,用来演示文件解压和压缩操作
[root@centos7-luffy testLinux]# ls
apache-maven-3.6.3-bin.tar.gz a.txt rename.txt
~~ 文件解压
[root@centos7-luffy testLinux]# tar zxvf apache-maven-3.6.3-bin.tar.gz
apache-maven-3.6.3/README.txt
apache-maven-3.6.3/LICENSE
apache-maven-3.6.3/NOTICE
apache-maven-3.6.3/lib/
apache-maven-3.6.3/lib/cdi-api.license
apache-maven-3.6.3/lib/commons-cli.license
apache-maven-3.6.3/lib/commons-io.license
apache-maven-3.6.3/lib/commons-lang3.license
apache-maven-3.6.3/lib/guava.license
······
[root@centos7-luffy testLinux]# ls
apache-maven-3.6.3 apache-maven-3.6.3-bin.tar.gz a.txt rename.txt
~~ 删除之前的压缩包,用文件夹压缩得到压缩包
[root@centos7-luffy testLinux]# rm -f apache-maven-3.6.3-bin.tar.gz
[root@centos7-luffy testLinux]# ls
apache-maven-3.6.3 a.txt rename.txt
~~ 文件压缩 tar -zvcf 压缩包文件名 要压缩的文件夹
[root@centos7-luffy testLinux]# tar -zcvf apache-maven-3.6.3.tar.gz apache-maven-3.6.3
apache-maven-3.6.3/
apache-maven-3.6.3/README.txt
apache-maven-3.6.3/LICENSE
apache-maven-3.6.3/NOTICE
apache-maven-3.6.3/lib/
apache-maven-3.6.3/lib/cdi-api.license
apache-maven-3.6.3/lib/commons-cli.license
apache-maven-3.6.3/lib/commons-io.license
apache-maven-3.6.3/lib/commons-lang3.license
apache-maven-3.6.3/lib/guava.license
apache-maven-3.6.3/lib/guice.license
apache-maven-3.6.3/lib/jansi.license
apache-maven-3.6.3/lib/javax.inject.license
apache-maven-3.6.3/lib/jcl-over-slf4j.license
apache-maven-3.6.3/lib/jsoup.license
apache-maven-3.6.3/lib/jsr250-api.license
apache-maven-3.6.3/lib/org.eclipse.sisu.inject.license
apache-maven-3.6.3/lib/org.eclipse.sisu.plexus.license
apache-maven-3.6.3/lib/plexus-cipher.license
apache-maven-3.6.3/lib/plexus-component-annotations.license
apache-maven-3.6.3/lib/plexus-interpolation.license
······
[root@centos7-luffy testLinux]# ls
apache-maven-3.6.3 apache-maven-3.6.3.tar.gz a.txt rename.txt
[root@centos7-luffy testLinux]#

关于网络的

netstat 命令用于显示各种网络相关信息,如网络连接,路由表,网络连接状态。命令格式:netstat [-options]

1
2
3
4
5
6
7
8
9
10
11
12
13
options 参数解析

-a (all)显示所有选项,默认不显示 Listen 相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令
1
2
3
4
5
6
7
8
9
10
11
12
13
# netstat -pt 
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 localhost:30037 *:* LISTEN 2109/firefox
....
------各项指标解析----------------------------------------
Proto 协议
Recv-Q 接收队列 ,一般都应该是0。如果不是则表示软件包正在队列中堆积
Send-Q 发送队列,一般都应该是0。如果不是则表示软件包正在队列中堆积
Local Address 本地地址+port
Foreign Address 远端地址+port
State 状态
PID 进程pid
Program name 进程名

netstat 常用命令

1
2
# netstat -anp
# netstat -tunlp

lsof(List Open Files) 用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。命令格式 lsof [options] filename

1
2
3
4
5
6
7
8
9
10
11
12
13
options 参数解释

-a 列出打开文件存在的进程
-c<进程名> 列出指定进程所打开的文件(常用)
-p<进程号> 列出指定进程号所打开的文件(常用)
-g 列出属于gid的进程详情
-u<uname/uid> 显示归属uname或uid的进程情况
-d<fd文件号> 列出占用该文件号的进程
+d<目录> 列出目录下被打开的文件
+D<目录> 递归列出目录下被打开的文件
-n<目录> 列出使用NFS的文件
-i<条件> 列出符合条件的进程。(ip4/ip6协议、端口、 @ip )
-u 列出UID号进程详情
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# lsof
command PID USER FD type DEVICE SIZE NODE NAME
init 1 root txt REG 8,2 43496 6121706 /sbin/init

---------各项指标解析-----------------------
COMMAND 进程的名称
PID 进程标识符
USER 进程所有者
FD 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE 文件类型,如DIR、REG等
DEVICE 指定磁盘的名称
SIZE 文件的大小
NODE 索引节点(文件在磁盘上的标识)
NAME 打开文件的确切名称

lsof 示例

1
2
3
4
5
6
7
8
9
10
~~ 显示所有打开80端口的进程
# lsof -i:80
~~ 那个进程在占用/etc/passwd
# lsof /etc/passwd
~~ 显示使用fd为1211的进程
# lsof -d 1211
~~ 显示那些文件被pid为 1211 的进程打开
# lsof -p 1211
~~ 查看sendmail进程的文件使用情况
# lsof -c sendmail

系统状况

top 命令是用来监控Linux系统状况,比如cpu、内存,进程等资源使用情况。命令格式:top [-options]

1
2
3
4
5
6
options 选项参数

-i<时间> 设置刷新间隔时间
-u<用户名> 指定用户名
-p<进程号> 指定进程
-H 开启线程查看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# top
top - 18:20:27 up 26 days, 8:30, 2 users, load average: 0.04, 0.09, 0.13
Tasks: 168 total, 1 running, 167 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.5 sy, 0.0 ni, 99.1 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem: 32762356 total, 14675196 used, 18087160 free, 884 buffers
KiB Swap: 2103292 total, 0 used, 2103292 free. 6580028 cached Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1260 root 20 0 7933492 1.173g 14004 S 0.333 3.753 58:20.74 java
1503 root 20 0 69172 2240 1412 S 0.333 0.007 0:48.05 httpd
1520 daemon 20 0 358140 3980 776 S 0.333 0.012 6:19.55 httpd
2323 mysql 20 0 19.918g 4.538g 9404 S 0.333 14.52 352:51.44 mysqld
.......
---------各项指标解析---------------------------------------------------
第一行统计信息区
18:20:27 当前时间
up 25 days, 17:29 系统运行时间,格式为时:分
1 user 当前登录用户数
load average: 0.04, 0.09, 0.13 系统负载,三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值

Tasks:进程相关信息
running 正在运行的进程数
sleeping 睡眠的进程数
stopped 停止的进程数
zombie 僵尸进程数
Cpu(s):CPU相关信息
%us:表示用户空间程序的cpu使用率(没有通过nice调度)
%sy:表示系统空间的cpu使用率,主要是内核程序
%ni:表示用户空间且通过nice调度过的程序的cpu使用率
%id:空闲cpu
%wa:cpu运行时在等待io的时间
%hi:cpu处理硬中断的数量
%si:cpu处理软中断的数量
%st:被虚拟机偷走的cpu
Mem 内存信息
total 物理内存总量
used 使用的物理内存总量
free 空闲内存总量
buffers 用作内核缓存的内存量
Swap 内存信息
total 交换区总量
used 使用的交换区总量
free 空闲交换区总量
cached 缓冲的交换区总量

~~ 常用的指标
PID 进程id
PPID 父进程id
UID 进程所有者的用户id
USER 进程所有者的用户名
GROUP 进程所有者的组名
TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
PR 优先级
NI nice值。负值表示高优先级,正值表示低优先级
P 最后使用的CPU,仅在多CPU环境下有意义
%CPU 上次更新到现在的CPU时间占用百分比
TIME 进程使用的CPU时间总计,单位秒
TIME+ 进程使用的CPU时间总计,单位1/100秒
%MEM 进程使用的物理内存百分比
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE 可执行代码占用的物理内存大小,单位kb
DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR 共享内存大小,单位kb
S 进程状态; 相关枚举值解释查看 ps -ef S 项解释
COMMAND 进程启动执行的命令行

top 命令下,查看信息常用快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
h    显示快捷键帮助
k 终止一个进程
i 开/关忽略闲置和僵死进程
q 退出程序
r 重新安排一个进程的优先级别
S 切换到累计模式
s 更改刷新间隔时间,单位秒
f,F 从当前显示中添加或者删除项目
o,O 改变显示项目的顺序
l 切换显示平均负载和启动时间信息
m 切换显示内存信息
t 切换显示进程和CPU状态信息
c 切换显示命令名称和完整命令行
M 根据内存使用大小排序
P 根据CPU使用率进行排序 (默认排序)
T 根据时间/累计时间进行排序
1 展开多核cpu显示
H 线程查看模式切换为开或关

文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及 IPC 有关的活动等。命令格式:sar [options] [-A] [-o file] delay [count]。delay 为采样间隔,count 为采样次数,默认值是1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
options 选项参数

-A 所有报告的总和
-o file 表示将命令结果以二进制格式存放在文件中,file 是文件名
-u 输出CPU使用情况的统计信息
-v 输出inode、文件和其他内核表的统计信息
-d 输出每一个块设备的活动信息
-b 显示I/O和传送速率的统计信息(相对-d 是汇总信息)
-r 输出内存和交换空间的统计信息
-R 输出内存页面的统计信息
-a 文件读写情况
-q 队列长度和平均负载
-c 输出进程统计信息,每秒创建的进程数
-y 终端设备活动情况
-w 输出系统交换活动信息
-x <pid> 显示给定进程的统计信息
-n <关键词> 统计网络信息
关键词可以是:
DEV 网卡
EDEV 网卡 (错误)
NFS NFS 客户端
NFSD NFS 服务器
SOCK Sockets (套接字) (v4)
SOCK6 Sockets (套接字) (v6)
IP IP 流 (v4)
EIP IP 流 (v4) (失败信息)
ICMP ICMP 流 (v4)
EICMP ICMP 流 (v4) (失败信息)
TCP TCP 流 (v4)
ETCP TCP 流 (v4) (失败信息)
UDP UDP 流 (v4)
IP6 IP 流 (v6)
EIP6 IP 流 (v6) (失败信息)
ICMP6 ICMP 流 (v6)
EICMP6 ICMP 流 (v6) (失败信息)
UDP6 UDP 流 (v6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# sar -u  1 2
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)

07:02:04 PM CPU %user %nice %system %iowait %steal %idle
07:02:05 PM all 23.90 3.22 7.97 5.25 0.00 59.66
07:02:06 PM all 26.53 4.76 8.84 5.95 0.00 53.91
Average: all 25.21 3.99 8.40 5.60 0.00 56.79
------各项指标解析---------------------------------
%user 用户空间的CPU使用
%nice 改变过优先级的进程的CPU使用率
%system 内核空间的CPU使用率
%iowait CPU等待IO的百分比
%steal 虚拟机的虚拟机CPU使用的CPU
%idle 空闲的CPU

查看内存使用情况 sar -r

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# sar -r 1 2
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)

07:05:16 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
07:05:17 PM 299596 32398396 99.08 2084 7615088 37900868 115.91 27267692 3809860 672
07:05:18 PM 298932 32399060 99.09 2084 7615848 37900100 115.91 27267828 3810252 488
Average: 299264 32398728 99.08 2084 7615468 37900484 115.91 27267760 3810056 580

------各项指标解析--------------------
kbmemfree 空闲的物理内存大小
kbmemused 使用中的物理内存大小
%memused 物理内存使用率
kbbuffers 内核中作为缓冲区使用的物理内存大小,kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.
kbcached 缓存的文件大小
kbcommit 保证当前系统正常运行所需要的最小内存,即为了确保内存不溢出而需要的最少内存(物理内存+Swap分区)
commit 这个值是kbcommit与内存总量(物理内存+swap分区)的一个百分比的值

查看 IO 和传递速率:sar -b

1
2
3
4
5
6
7
8
9
10
11
12
13
# sar -b 1 2
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)

07:06:08 PM tps rtps wtps bread/s bwrtn/s
07:06:09 PM 171.00 0.00 171.00 0.00 3431.00
07:06:10 PM 163.00 0.00 163.00 0.00 2620.00
Average: 167.00 0.00 167.00 0.00 3025.50
------各项指标解析--------------------
tps 磁盘每秒钟的IO总数,等于iostat中的tps
rtps 每秒钟从磁盘读取的IO总数
wtps 每秒钟从写入到磁盘的IO总数
bread/s 每秒钟从磁盘读取的块总数
bwrtn/s 每秒钟此写入到磁盘的块总数