Linux知识点总结如下,在日常生产操作和面试中会涉及到
1.常见的Linux的发行版本有哪些:
答:ubunt CentOS redhat等
2.切换用户的命令: su lizhi切换到lizhi用户(不需要输入密码) su root 切换到root用图画(需要输入密码)
3.修改用户密码:passwd lizi 修改lizhi用户的密码
4.测试当前系统与指定IP地址系统的网络连接状态: ping IP地址 crul httpXXX 测试url地址
5.目录切换:cd /etc/lizhi/test/
6.切换到上一层目录:cd ..
7.切换到系统根目录:cd /
8.切换到用户主目录(root目录下):cd ~
9.创建文件夹命令:mkdir 文件夹名称
10.查看文件夹(目录)的命令:
ls 文件夹名:查看该文件夹下的所有目录和文件(不包含隐藏)
ls -a 文件夹名:查看该文件夹下所有文件和目录 包含隐藏文件
ll 文件夹名:查看该文件夹下所有的目录和文件的详细信息(不包含隐藏)
11.修改文件夹 文件 压缩包名称:mv 旧名称 新名称
12.移动文件夹 文件 压缩包等所使用的命令:mv 文件名称 文件的新位置
13.拷贝文件 文件夹 压缩包:cp 文件 文件新位置
14.删除文件文件夹 压缩包:rm -rf 文件名称
15.创建一个文件:touch 文件名称
16.查看文件:cat 文件名
17.vi(vim)文本编辑器有三种工作模式:命令行模式 插入模式 和底行模式,其中新系统需要自己安装vim才可使用 vim编辑器
命令行模式:最初进入的一般模式,该模式下可以移动光标进行浏览,删除整行(dd) 复制整行(yy,6yy表示复制6行),粘贴(p),但是无法编辑文字。
插入模式:可使用i键从命令行模式切换到插入模式,只有在该模式下,用户可编辑文件,可使用[esc]键返回命令行模式
底行模式:通过“:”从命令行返回到底行模式,在该模式下,可对文件保存w 退出q 可设置编辑环境,如寻找 列出行号,:wq保存并退出 :q!表示强制退出
18.修改一个文件命令(vi文本编辑器)
1.输入命令vim 文件名 打开文件 进入到命令行模式,按键盘i进入插入模式进行编辑
2.编辑完后 按esc键退出插入模式 进入命令行模式
3.输入:进入底行模式 输入wq 保存并退出
19.将 /lizhi 目录下的所有文件和目录打包并压缩成一个temp.tar.gz文件:tar cvzf temp.tar.gz /lizhi
20.将XXX.tar.gz文件解压到user目录下:tar xvzf xxx.tar.gz /user
21.安装名字为tftp软件:rpm -ivh tftp.rpm
22.显示当前目录的绝对路径: pwd
23.查看当前系统网络信息:ifconfig
24.配置eth0这一网卡的IP为192.168.0.1:ifconfig eth0 192.168.0.1
25.暂停etho网卡工作:ifconfig eth0 down
26.恢复eth0网卡:ifconfig eth0 up
27.系统中的每一个文件或者目录的访问权限分为 可读 可写 可执行。每一个文件或者目录的访问权限独有三组,可读 可写 可执行,当使用ls -l命令显示文件或者目录的详细信息时,最左边的一列为文件的访问权限 如:ls -l sobsrc.tgz 显示为-rw-r--r--1 root root 483997 Jun1 15 17:31 sobsrc.tgz r为可读 w为科协 x表示可执行,横线代表无该项权限。
27.chmod 761 hello.c 表示hello.c文件的访问权限是什么:
chmod 761 hello.c <--> chmod 111110001 hello.c
文件所有者对hello.c文件可读 可写 可执行,与所有同组的用户对其可读写执行,系统用户不可读写 可执行
28.项目开发中 为了方便操作 会把经常用到的文件或者目录设置为可读 科可写 可执行,:chmod 777 hello.c
29.Linux上安装软件:安装jdk mysql tomcat
30.远程连接Linux的工具:secureCRT SSHSecure mobaXterm
31.安装jdl的步骤:
1.查看Linux是否安装了jdk: rmp -qa|grep java
2.卸载两个OpenJDK :rmp -e --nodeps 要写在的软件
3.上传jdk到Linux
4.安装jdk运行需要的插件 yum install glibc.i686
5.解压jdk到/usr/local下 首先保证是在目录为/
tar –xvf jdk-7u71-linux-i586.tar.gz –C /usr/local(有滚动条)
或者:tar –zxvf jdk-7u71-linux-i586.tar.gz –C /usr/local(有滚动条)
或者:tar –zxf jdk-7u71-linux-i586.tar.gz –C /usr/local(没有滚动条)
6.改名字 rm jdk_1.7.0_71 jdk1.7
7.配置环境变量 打开/etc/profile配置文件,拷贝文件
vim /etc/profile 按i进入插入模式。复制如下:
然后保存即可
#set java environment
JAVA_HOME=/usr/local/jdk1.7.0_71
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
7)重新加载/etc/profile配置文件 source /etc/profile :source /etc/profile
8) 输入java-version查看是否安祖航成功 至此安装完成。
32. 安装mysql步骤:
1.查看Linux自带的mysql:rpm -qa|grep mysql
2.卸载自带的mysql:rpm -e--nodeps mysql-libs-5.1.73-3.el6_5.i686
3.上传mysql到Linux
4.安装mysql依赖 yum -y install libaio.so.1 libgcc_c.so.1 libstdc++.so.6
yum update libstdc++-4.4.7-4.el6.x86_64
5.解压mysql到/usr/local/下的mysql目录(mysql目录需要自己手动创建)
cd /usr/local
mkdir mysql
tar -xvf MySQL-5.6.22-1.el6.i686.rpm-bundle.tar -C /usr/local/mysql
6.在/usr/local/mysql下安装mysql
安装服务器端:rpm -ivh MySQL-server-5.6.22-1.el6.i686.rpm
安装客户端:rpm -ivh MySQL-client-5.6.22-1.el6.i686.rpm
7.启动mysql
service mysql start(这种放肆每次都要启动一次,不推荐)
加入到系统服务中并开机启动
加入到系统服务:chkconfig -add mysql
自动启动:chkconfig musql on
8.登录mysql
mysql安装后会生成一个随机木马,存储在/root/.mysql_secret 查看该文件,会有
the random password set for the root user at XXX(localtime):XXXX 这里就是密码
mysql -u root -p
输入找到的密码 会报错,因为我们刚只是设置了自动启动,还没启动mysql
需要再次输入 service mysql start
9.修改密码:
set password = password('root') root为新密码
10.开启mysql远程登录
默认情况下mysql为安全起见,不支持远程登录,所以需要手动开启远程登录权限,登录mysql后输入如下命令: grant all privileges on *.* to 'root' @'%' identified by 'root';
fulsh privileges;
11 开放Linux的对外访问端口3306
/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
/etc/rc.d/init.d/iptables save ---将修改永久保存到防火墙中
注意:你想开放哪个端口 就把3306处给替换一下
33 安装tomcat
1.上传tomcat到Linux下
2.解压tomcat到/usr/local文件夹下:tar -xvf apache-tomcat-7.0.57.tar.gz -C /usr/local
进入到解压文件所在的目录。看到解压成功,但是这个名字太长 改个名字:
cd /usr/local
ls 看到了apache-XXXX很长的名字
mv apache-XXX/ tomcat :改名字
3.启动tomcat
进入tomcat的bin下启动 ./startup.sh
这样tomcat就启动成功,但是也许可能访问不成功,因为防火墙把8080给挡住了,
4.开放8080端口,并添加到防火墙中
/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
/etc/rc.d/init.d/iptables save
5.再次访问 成功
附:
如何关闭Linux的防火墙
关闭防火墙:service iptables stop
永久关闭防火墙:chkconfig iptables off
开启防火墙:service iptables start
关闭tomcat:进入到/bin下面 ./shutdown.sh 即可
启动tomcat: bin下的./startup.sh
关闭tomcat: bin下的 ./shutdown.sh
33 各类其他的操作汇总:
2.文件的操作
pwd 显示当前所在的路径
mkdir filename 创建文件夹
mkdir -p /a/b 创建嵌套的目录
touch filename 创建文件
cp filename new_filename 复制文件
mv filename path 移动文件(如果路径中带文件名,则会给文件重命名)
rm -r filename 删除文件或者文件夹,(-r是递归的意思)
rm -f 强制删除目录或文件
rmdir filename 删除文件夹(只能是空文件夹)
find / -name "install.log“ 查找 可以用*作为通配符;
1.修改文件操作权限
chmod u+x filename 给所属用户增加执行的权限
chmod g-w filename 给组减少写的权限
chmod o+w filename 给其他用户增加写的权限
chmod 777 filename 给所属用户,所属组,其他用户开放所有权限;
3. 日常维护用的命令
1.找到服务器对应的进程 ps -ef |grep "tomcat" 这样就能知道服务器所对应的进程,以及服务器安装的目录。
2.关闭服务器可以用kill -9 pid 杀死进程。也可以到tomcat的bin目录下./shutdown.sh。开启服务器./startup.sh
3.用winscp,上传修改后的文件。
4.日志查看,tail -200f catalina.out 显示日志的最后200行。ctrl+c 退出查看;
find /path -type d |wc -l 统计某路径下文件夹的个数
find /path -type f | wc -l 统计某路径下文件的个数
cat 查看文件内容
wc -lwc filename 统计文件的行数,字符数,字节数 l表示行数,w表示字符数,c表示字节数
> 覆盖式输出重定向符 >>追加式输出重定向符
vi filename 对文件进行编辑。
vi有三种模式,分别是命令模式、插入模式和末行模式。
默认进入命令模式,其他模式按esc也可进入命令模式
Page Down 或Ctrl+F 下翻一页
Page Up 上翻一页
Home或^ 或0 跳至行首
End 或$ 跳至行尾
1G 或 gg 跳至首行
G 跳至尾行
#G 跳至第#行
:set nu 示行数
:set nonu 显示行数
x或del 删除光标处的单个字符
dd 删除当前行
#dd 删除当前行开始的#行
d^ 删除当前行首至光标的字符
d$ 删除当前行尾至光标的字符
yy 复制当前行
#yy 复制当前行开始的#行
p 粘贴至光标的右侧
P 粘贴至光标的左侧
/word 向下查找字符串word
?word 向上查找字符串word
n 光标定位至下一个匹配字符
N 光标定位至上一个匹配字符
u 单次撤销 多次恢复
U 撤销所有编辑
插入模式:命令模式下,i 、a、o、 Insert即可进入。该模式可用于编辑文本
末行模式:shit+: 即可进入
:w 保存文件
: /filename 另存文件为fielname
:q 未修改时退出
:q! 不保存且强制退出
:wq 保存修改并退出
:s /old/new 前行的第一个old替换为new
:s /old/new/g 前行的所有old替换为new
:#,# s /old/new/g #行间的所有old替换为new
:% s /old/new/g 当前文件所有old替换为new
:s /old/new/c old替换为new时提示确认替换
:g/str1/s//str2/g str2 替换所有的str1
34 docker 安装mysql tomcat jdk的操作:
1.docker 安装mysql
1.1 先从镜像仓库拉取mysql的镜像文件:docker pull mysql:5.6
1.2 启动一个容器:docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v $PWD/conf:/etc/mysql/conf.d -v $PWD/data:/var/lib/mysql -v $PWD/logs:/logs --name test_mysql mysql:5.6
参数说明
-d 让容器在后台运行
-p 3306:3306 将容器的 3306 端口映射到主机的 3306 端口
-e 设置环境变量,这里是设置mysql的root用户的初始密码,这个必须设置
-v $PWD/conf:/etc/mysql/conf.d 将主机当前目录下的 conf/my.cnf 挂载到容器的
/etc/mysql/my.cnf
-v $PWD/data:/var/lib/mysql 将主机当前目录下的data目录挂载到容器的 /var/lib/mysql
-v $PWD/logs:/logs 将主机当前目录下的 logs 目录挂载到容器的 /logs
–name 容器的名字,随便取,但是必须唯一
1.3 通过命令docker ps -l 查看刚刚创建的容器
1.4 进入刚刚创建的容器中:docker exec -it test_mysql /bin/bash
参数说明:-i 对容器进行标注输入进行交互 -t 在容器里产生伪终端
容器里没有vim 得先安装vim 安装前需要先执行apt update命令,不然会报错,
1.4.1 apt-get update 作用:同步/etc/apt/sources.list和/etc/apt/sources.list.d中列出来的源索引,这样才能获取到最新的软件包
1.4.2:apt-get install vim
1.5 进入到刚创建的容器中,docker exec -it test_mysql /bin/bash
通过上面步骤中的-e MYSQL_ROOT_PASSWORD设置root账户的初始登录密码登录mysql
查看默认的用户访问设置
如上则可以在主机上直接通过mysql -h 127.0.0.1 -u root -p 连接mysql了
设置远程访问授权等信息
mysql -u root -p
grant all privileges on *.* to root@"%" identified by "123456" with grant option;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'
flush privileges;
取消mysql查询大小写问题
进入docker的mysql容器,编辑/etc/mysql/mysql.conf.d/mysqld.cnf文件 在[mysqlId]下添加如下:
[mysqlId]
lower_case_table_names=1
保存并退出容器;执行sudo docker restart mysql 重启mysql即可查看
解决Mysql5.7的查询兼容问题。此设置重启失效。
如:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
MySQL 5.7.5和up实现了对功能依赖的检测。如果启用了only_full_group_by SQL模式(在默认情况下是这样),那么MySQL就会拒绝选择列表、条件或顺序列表引用的查询,这些查询将引用组中未命名的非聚合列,而不是在功能上依赖于它们。(在5.7.5之前,MySQL没有检测到功能依赖项,only_full_group_by在默认情况下是不启用的。
解决方案1:
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
解决方案2(写配置文件,重启不失效。去除NO_ZERO_IN_DATE,NO_ZERO_DATE,解决时间戳的问题):
进入docker的MySQL容器,编辑/etc/mysql/mysql.conf.d/mysqld.cnf文件,在[mysqld]下添加如下:
sql-mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
解决Mysql5.7的密码修改不兼容问题
ysql5.7更改密码,以前的方式会报错。代码如下:
update mysql.user set password=password('root') where user='root'
提示ERROR 1054 (42S22): Unknown column 'password' in 'field list'
最新的更改密码代码是:
update mysql.user set authentication_string=password('root') where user='root'
启动docker中 MySQL的时候可以加参数。含义是:
-restart=always 跟随docker启动
--privileged=true 容器root用户享有主机root用户权限
-v 映射主机路径到容器
-e MYSQL_ROOT_PASSWORD=root 设置root用户密码
-d 后台启动
--lower_case_table_names=1 设置表名参数名等忽略大小写
---------------------
docker 安装tomcat
1. docker pull tomcat:8.5-jre10-slim进行拉取,完成后输入命令查看docker images查看系统中的所有
docker镜像。
2. 输入命令运行一个容器:docker run -it -d -p 7899:8080 tomcat:8.5-jre10-slim
-t 选项让Docker分配一个伪终端( pseudo-tty)并绑定到容器的标准输入上,
-i 则让容器的标准输入保持打开。
-p 表示端口号,前一个7890是指我们访问tomcat时的端口号(宿主机端口),
后一个8080是tomcat启动的一个容器在docker中运行的端口号,
指定端口号为了更明确的访问tomcat。
输入命令docker ps查看正在运行的容器发现状态是Up表示正在运行
3. 查看tomcat是否启动,输入宿主机IP+端口号:http://192.168.182.129:7899/访问结果如下
4. 这时候一个tomcat进程就启动了,如何向其中部署项目,就需要对容器对应的镜像进行构造,将编译后的文件或.war文件上传到镜像的webapps目录下。还有springboot项目在docker中的部署。在后续内容中会分享
docker安装jdk
1.查找jdk镜像:docker search jdk
2.下载openjdk镜像:docker pull openjdk
3.运行jdk容器:docker run -d -it --name myopenjdk openjdk /bin/bash
注意: -it /bin/bash 一定不能省了,不然jdk起不来,或者懒人写法 -it bash 也可以。
4.进入容器:docker exec -it myopenjdk /bin/bash
或者:
解压到指定目录
tar -zxvf jdk-8u181-linux-x64.tar.gz -C /usr/local/
配置环境变量
使用vi 也可以使用vim
vi /etc/profile
jdk8
JAVA_HOME=/usr/local/jdk8
JRE_HOME=/usr/local/jdk8/jre
CLASS_PATH=.:JAVAHOME/libPATH=JAVAHOME/libPATH=JAVA_HOME/bin:JREHOME/bin:JREHOME/bin:PATH
export PATH CLASS_PATH
刷新配置文件
source /etc/profile
配置完成 也可以根据容器提交成新的镜像,以便下次使用方便。
docker commit m=”centos7-jdk8” 基础镜像id tag
docker images 就可以看到新生成的镜像了。
35 性能分析:
性能分析:
1 vmstat: 虚拟内存统计
用法: vmstat [options] [delay[count]]
Usage:
vmstat [options] [delay [count]]
Options:
-a, --active active/inactive memory
-f, --forks number of forks since boot
-m, --slabs slabinfo
-n, --one-header do not redisplay header
-s, --stats event counter statistics
-d, --disk disk statistics
-D, --disk-sum summarize disk statistics
-p, --partition partition specific statistics
-S, --unit define display unit
-w, --wide wide output
-t, --timestamp show timestamp
-h, --help display this help and exit
-V, --version output version information and exit
其中
r : 运行和等待 CPU 时间片的进程数。若该值大于系统 CPU 个数,则说明 CPU 不足
b : 表示等待资源的进程数
swpd : 切换到内存交换区的内存大小(单位 KB)
free: 空闲的物理内存的大小,我的机器内存总共2G,剩余92M。
buff: Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存
cache:直接用来记忆我们打开的文件,给文件做缓冲,把空闲的物理内存的一部分拿来做文件和目录的缓
存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用
si:每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗
内存进程解决掉。
so:每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi:块设备每秒接收的块数量(读磁盘)(kb/s)
bo:块设备每秒发送的块数量(写磁盘)(kb/s)
in:每秒CPU的中断次数,包括时间中断
cs:每秒上下文切换次数。
us:用户进程消耗 CPU 时间百分比
sy:内核进程消耗 CPU 时间百分比,sy 的值较高时,则说明内核消耗的 CPU 资源很多
id:空闲 CPU 时间百分比
wt:IO 等待 CPU 时间百分比
2.free 内存使用状况
free -h free -m free -g free -h 2 free -h -s 2
3.uptime 统计当前系统的运行情况
4.netstat 当前网络信息
用法:usage: netstat [-vWeenNcCF] [] -r netstat {-V|--version|-h|--help}
netstat [-vWnNcaeol] [ ...]
netstat { [-vWeenNac] -I[] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] }
[delay]
-r, --route display routing table
-I, --interfaces= display interface table for
-i, --interfaces display interface table
-g, --groups display multicast group memberships
-s, --statistics display networking statistics (like SNMP)
-M, --masquerade display masqueraded connections
-v, --verbose be verbose
-W, --wide don't truncate IP addresses
-n, --numeric don't resolve names
--numeric-hosts don't resolve host names
--numeric-ports don't resolve port names
--numeric-users don't resolve user names
-N, --symbolic resolve hardware names
-e, --extend display other/more information
-p, --programs display PID/Program name for sockets
-o, --timers display timers
-c, --continuous continuous listing
-l, --listening display listening server sockets
-a, --all display all sockets (default: connected)
-F, --fib display Forwarding Information Base (default)
-C, --cache display routing cache instead of FIB
-Z, --context display SELinux security context for sockets
={-t|--tcp} {-u|--udp} {-U|--udplite} {-w|--raw} {-x|--unix}
--ax25 --ipx --netrom
=Use '-6|-4' or '-A ' or '--'; default: inet
List of possible address families (which support routing):
inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25)
netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP)
x25 (CCITT X.25)
其中
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
5.top:监控Linux系统状态 如cpu 内存使用
其中
第一行:
14:36:14 当前系统时间
days, 4:43 系统已经运行了2天4小时43分钟(在这期间没有重启过)
1 users 当前有1个用户登录系统
load average: 0.00, 0.01, 0.05 ,后面的三个数分别是1分钟、5分钟、15分钟的负载情况。load
average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻
辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第二行:Tasks 任务(进程),
系统现在共有10个进程,其中处于运行中的有2个,108个在休眠(sleep),stoped状态的有0个,
zombie状态(僵尸)的有0个。
第三行:cpu状态
us 用户空间占用CPU的百分比
sy 内核空间占用CPU的百分比
ni 改变过优先级的进程占用CPU的百分比
id 空闲CPU百分比
wa IO等待占用CPU的百分比
hi 硬中断(Hardware IRQ)占用CPU的百分比
si 软中断(Software Interrupts)占用CPU的百分比
第四行:内存状态
total 物理内存总量
free 空闲内存总量
used 使用中的内存总量
buff/cache 缓存的内存量
第五行:swap交换分区
total 交换区总量
free 空闲交换区总量
used 使用的交换区总量
avail Mem 缓冲的交换区总量
第六行:各进程(任务)的状态监控
PID 进程id
USER 进程所有者
PR 进程优先级
NI nice值。负值表示高优先级,正值表示低优先级
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR 共享内存大小,单位kb
S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU 上次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比
TIME+ 进程使用的CPU时间总计,单位1/100秒
COMMAND 进程名称(命令名/命令行)
6.监控java线程数:ps -elf grep java wc -1
7.监控网络客户连接数:netstat -n grep tcp grep 侦听端口 wc -1
8.dmesg | tail :该命令会输出系统日志的最后10行。示例中的输出,可以看见一次内核的oom kill。这些
日志可以帮助排查性能问题。千万不要忘了这一步。
9.mpstat -P ALL 1:该命令可以显示每个CPU的占用情况,如果有一个CPU占用率特别高,那么有可能是一个单线程应用程序引起的。
10.pidstat 1 :pidstat命令输出进程的CPU占用率,该命令会持续输出,并且不会覆盖之前的数据,可以方便观察系统动态。如上的输出,可以看见两个JAVA进程占用了将近1600%的CPU时间,既消耗了大约16个CPU核心的运算资源。
11. iostat -xz 1:r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。
await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。
avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。
%util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。
如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能。