线程池 七大参数:
为什么不用Excutor创建线程?
Excutor 是创建线程池的工具类,有四个
SingleThreadPool
FixedThreadPool
CacheThreadPool
ScheduleThreadPool
前两个是会创建固定的线程数,但是阻塞队列是无边界的,会导致请求的堆积,最终OOM
后两个会创建Integer.MAX_VALUE个线程,导致OOM
向线程池添加任务后线程池的处理逻辑
首先判断当前线程池任务量有没有达到核心线程数大小,没有达到就创建线程来执行任务
到达了,就看阻塞队列满没满,没满就放到阻塞队列里
满了,就判断当前线程数是不是达到最大线程数,没有就创建线程去执行
达到最大线程数了,那就要执行拒绝策略了
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()操作
如果链表已经到底Integer.MAX_VALUE,就不再进行扩容了
否则就翻倍扩容*2
rehash()
现在就要进行数组的迁移操作了,头节点不为空,就把当前桶位置为空
当前桶只有一个原始,直接进行寻址算法,找到新的桶位置
已经树化了,也是重新找桶的位置
已经链化了,就分高位链表和低位链表,低位链表存放在扩容之后的数组下标的位置,与当前数组下标位置一致的元素,高位链表存放在扩容之后的数组下标的位置为当前数组下标位置+ 扩容之前数组长度的元素,进行链表的拼接
如果是一个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的分段锁吧
Segment继承自ReentrantLock,有了锁的功能,是分段的,当Segment越来越大,锁的粒度也越来越大
分段锁优势在于操作不同的Segment是并发的,不需要锁,操作同一个Segment是需要锁的,相对于对整个map加锁是有优势的
缺点在于分成很多段是会比较浪费内存空间(不连续,碎片化);操作map时竞争同一个分段锁的概率非常小时,分段锁反而会造成更新等操作的长时间等待; 当某个段很大时,分段锁的性能会下降。
为什么不用ReentrantLock而用Sync?
减少内存开销:如果使用ReentrantLock则需要节点继承AQS来获得同步支持,增加内存开销,而1.8中只有头节点需要进行同步。
内部优化:synchronized则是JVM直接支持的,JVM能够在运行时作出相应的优化措施:锁粗化、锁消除、锁自旋等等。
SQL优化
这个基本上也是必问的一道题,先说思路和维度
分析语句,是否加载了不必要的字段和数据
分析SQL执行计划,是否命中索引?这时候可以讲讲适合创建索引的字段,索引失效的情况,
如果SQL很复杂,优化SQL结构
如果单表数据数据量过大,可以考虑分表?水平分表?hash或者range
1. 优化表结构
尽量使用数字型字段
若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符型,而对数字型只需要一次比较即可
能用char就用char,存取更快(会问char和varchar的区别,char是固定长度,英文1个字节,中文2个字节,varchar是变长的,中英文都是2个字节)
当索引列出现大量重复数据,离散性不好,比如性别,状态等,就需要删掉索引
2. 优化查询 适合创建索引的列
主键(默认就是聚簇索引)
经常查
非空
需要order by,group by
非空、唯一
经常范围查询
不适合创建索引的列
很少查询的列
定义为text,bit,image的数据类型
有null的
修改性能远远大于检索时,不应该创建索引
索引失效的情况
where中存在函数类型转换,比如select * from news where year(publish_time) < 2017
遇到null
!= ,not in ,not exits会走索引,in也不一定都会走索引,假如in中的集合包含了很多数据,innodb判断性能还不如直接扫表,那就不会走索引了
like,对于where filed like ‘%luffy%’,不会走索引,但where filed like ‘luffy%’会走索引,取决于%的位置
遇到运行 比如where id * 3 = 100,不会走,可以优化成where id = 100 / 3
需要注意覆盖查询 ,防止回表查询。复合索引符合最左前缀原则
3.优化索引
对作为查询条件和order by的字段建立索引
避免过多的建立索引,多使用组合索引
接下是个重头戏了,分析执行计划Expain SQL
id 查询的序号
select_type 简单查询还是复杂查询
table 在哪个表上进行操作
type 最重要的一个参考之一,表示关联类型或者访问类型,即返回MySql决定如何查找表中的数据。从最优到最差分别为:system—>const—>eq_ref—> ref—> fulltext—> ref_or_null—> index_merge—> unique_subquery—> index_subquery—> range—> index—>All
pussible_keys 显示查询可能使用哪些索引来查询
key 实际采用了哪个索引
key_len 显示mysql在索引中使用的字节数,通过这个值可以算出具体使用了索引中的哪些列
ref 显示了在key列记录的索引中,表查找值所用到的列或常量。常见的有:const(常量)、func,NULL,字段名
rows mysql估计要读取并检测的行数,不是结果集的行数
Extra 显示额外信息,Using index,Using where,Using temporary等
Linux常用命令 这个东西这没啥好说的,多敲就行,但一段时间不用,基本上全忘了,面试也会问开发环境,那就一定要说下Linux,毕竟企业部署都是在Linux上,这里也只是说下Java工程师常用命令,多的感觉没必要去记,用到去查就是
切换root用户
文件常用操作
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 每秒钟此写入到磁盘的块总数