常用命令[]
cp | Copy | mv | 移动、重命名 | yum | yum nstall xxx |
rm | rm –rf xx | mkdir | 建目录 | rpm | rpm –ivh xxx.rpm |
tail | tail –f rr.log | find | find /usr/local -name xxx | tar | ①tar xzvf xxxx.ta.gz |
rz | 上传文件 | sz | 下载 | ②cd xxx ./configure ./configure –prefix=/user/local[指定目录]加参数 | |
wc | 行、字、字节数 | chmod | chmod 777 –R xxx | ||
head | head -3 sqlq.log |
|
| ||
ps | ps –ef|more | kill | ps -ef | grep xx kill -9 [xxPID] | ③make && make install | |
grep | 查找 |
| |||
|
|
|
|
|
|
vi /etc/profile 最下面配置环境变量 |
|
|
2.影响性能的因素
因素1:cpu
因素factor | 指标metrics | 描述 | 备注 | 监测monitor | |
CPU /proc/cpuinfo | Load average | 等待执行的队列中进程数+ 等待uninterruptable task完成的进程数 | cpu负荷的趋势. | top | |
Procs | Run queue | Runnable,ready to run(running / waiting for runtime)的进程数【可执行未执行的】 |
| vmstat(r) | |
Blocked | uninterruptible wait(通常因IO)进程数 |
| vmstat(b) | ||
System | Context Switch | 线程的切换 | 减少程序无关的请求 | vmstat(cs) | |
Interrupts | 正在处理的中断数: (hi)Hard interrupts、(si)soft interrupts |
| top (cpu--hi、si) vmstat(in) | ||
cpu 利用率 | User time | 处理非内核操作的时间 | User%+sys% 好(<70%)一般(85%)糟糕(>=90) | top vmstat iostat(avg-cpu)
| |
System time | 处理内核操作的时间 | ||||
Waiting | 等待io完成的时间 |
| |||
Idle time | 空闲时间 | <5%-à充分利用 | |||
Nice time | 处理re-nicing进程的时间 |
| iostat(nice%) | ||
CPU影响大是最误区,因为服务器的cpu一般是overconfigured。除非一些cpu密集使用的应用。 | |||||
简单解决方法 | |||||
如果有多余的进程,可以ps –ef来停掉 CPU-intensive的进程,可以renice调整优先级 SMP-based使用taskset来将进程绑定cpu,避免来回切换 最新驱动和防火墙,减少对cpu的负载。 |
案例:CPU高的分析
1、us% or sy%高,使用命令top;
1.1.1 、us%高,看看是哪个任务/线程的占用高,使用top排序或者ps –ef查看
1.1.2、了解线程的作用,可使用strace 查看该进程的执行情况,分析是否有异常,是否需要调整。
1.2.1、sy%高,查看memory、io方面性能,使用vmstat、iostat命令。
1.2.2、memory方面的问题,考虑是否要调整这方面的参数或增加内存
1.2.2、io方面的问题,考虑是否要增加快速的磁盘驱动等解决方案。
1.2.3、也要查看进程的占用情况,用strace查看该进程的执行情况,分析是否有异常,是否需要调整。
因素2:内存
因素factor | 指标metrics | 描述 | 监测monitor | 备注 |
Memory /proc/meminfo | Free memory | Linux把未使用的内存作为buffer和cache。 | top(mem-free) vmstat(free) |
|
Swap usage (si、so) | 使用的swap space。 physical memory用完后, 将最近使用过,暂不使用的memory pages 从physical memory写到swap space。 表示剩余的可支配物理内存严重不足,需要通过与磁盘交换内容来保持系统稳定性;磁盘处理速度要远小于内存,值越大性能瓶颈越明显。 | top(swap-used) vmstat(swpd) | si 、so[à0好]: swap频繁程度,长期很大,表示内存不够or未有效利用内存 | |
Buffer | 不同步设备、优先级不同的设备间缓存 | top(mem-buffers) vmstat(buffer) |
| |
Cache | Cpu和主内存间高速文件缓存(cpu刚用过或循环使用的部分数据,cpu再用时就从cache调用) | top(swap-cached) vmstat(cache) |
| |
Slabs | 内核使用 | vmstat –m |
| |
Active\inactive memory | 活跃和不活跃的内存大小 | vmstat -a |
| |
瓶颈表现 | free↓,swpd↑(si、so↑),bi 、bo↑,in↑,cs↑、b↑,wa↑ | |||
测试期间,保持内存充足,可用内存>20% | ||||
简单解决方法 | ||||
调整swap space,使用大页面,大块内存,共享内存; 调整页面的大小; 改进对活动和非活动内存的处理; 调整换页率page-out rate.; 限制服务器上每个用户的可用资源; 停掉不需要的服务; 增加内存; |
因素3:I/O
因素 | 指标metrics | 描述 | 监测monitor | |
I/O
| 等待 | iowait | 等待io操作的时间 好(<20%)一般(=35%)糟糕(>=50%) | iostat(avg-cpu:iowait) |
Average wait | 实际的io操作时间svctm + +在io队列中等待时间 Svctm越接近awai越好 | iostat –x (await) | ||
Average queue length | Io请求队列长度 | iostat –x (avgqu-sz) | ||
请求数 | Tps | 每秒处理的io操作数量。 | iostat (tps) | |
r/s、w/s | 每秒读、写请求数 | iostat –x(r/s 、w/s) 或用rrqm/s 、wrqm/s(合并请求)考察 | ||
数据量 | bi、bo | 读、写磁盘的块数(block/s) | vmstat(bi、bo) iostat(Blk_read、BLk_wrtn) 或用kb、mb做单位考察总读写量 | |
KB r/s、KB w/s | 每秒对设备读、写数量Kb/s | iostat (Kb_read/s、Kb_wrtn/s) 或用MB、块、扇区做单位考察每秒读写量 | ||
瓶颈表现 | (%util↑)设备繁忙、(await>>svctm)IO请求等待时间长,(avgqu-sz↑)等待队列长度大。 | |||
简单解决方法 | ||||
少量的大容量磁盘、减少逻辑盘; 序列式且控制器的带宽压力大,添加更快的磁盘控制器;随机式,增加磁盘驱动; Raid环境中,添加磁盘驱动; 增加RAM; |
因素4:Network
因素factor | 指标metrics | 描述 | 备注 | 监测monitor |
Network
| 收、发送的包数 |
|
|
|
收、发送的字节数 |
|
| ||
每秒冲突数 |
|
| ||
掉包的数量 |
|
| ||
Overruns |
|
| ||
Errors |
|
| ||
查看网络流量 | watch –n 1 “/sbin/ifconfig eth0|grep bytes”
| 外网: tx 发送[transport] rx 接收[receive] 内网相反。 | ||
date;ifconfig eth0 显示当前日期下网卡网络情况
| ||||
简单解决方法 | ||||
调整网络配置; 换网卡、加更快的网卡。 修改ipv4 tcp的内核参数; |
案例:大量TIME_WAIT连接
使用netstat –ae|grep “TIME_WAIT”|wc –l #查看多少个TIME_WAIT
[往往是因为程序代码中未关闭mysql连接netstat -ae |grep mysql]。
解决方法:
调整内核参数:vi /etc/sysctl.conf
加入以下内容, 修改后,执行/sbin/sysctl –p 让参数生效:
net.ipv4.tcp_syncookies=1
#开启SYN Cookies。当SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认0(关闭)
net.ipv4.tcp_tw_reuse=1 #开启重用。允许将TIME-WAIT socket重用于新的TCP连接,默认0(关闭)
net.ipv4.tcp_tw_recycle=1 #开始TCP连接中TIME-WAIT socket的快递回收,默认0(关闭)
net.ipv4.tcp_fin_timeout=30 #修改系统默认的TIME_OUT时间
net.ipv4.tcp_keepalive_probes=5 #减少超时前的探测次数
net.ipv4.tcp_keepalive_intvl=20 #探测消息发送频率
net.ipv4.tcp_keepalive_time=1200
#表示当keepalive启用时,TCP发送的keepalive消息的频率。缺省值为2小时,修改为2分钟。
net.ipv4.ip_local_port_range=1024 65000
#用于向外连接的端口范围。缺省情况很小为32768到61000,改为1024到65000
net.ipv4.tcp_max_syn_backlog=8192
#SYN队列的长度,默认为1024,加大了队列的长度为8192,可容纳更多等待连接的网络连接数
net.ipv4.tcp_max_tw_buckets=5000
#同时保持TIME_WAIT的最大数量,如超出,立刻清除TIME_WAIT、打印警告信息。默认180000,改为5000
3.监测性能指标的工具
Use the monitoring tools to to narrow down the bottleneck to the subsystem level.
工具1:top命令
top | 动态\实时的运行情况 当前活跃的进程信息 参数:top –u root(看这user是这root的)、top –p 123(看pid123的) | ||||
汇总信息 | 运行时间 Load average | 当前时间\运行时间\用户数 平均负载(1min、5min、15min),后两个时间段是重要的 | |||
task和cpu | Task:running; sleeping; stopped; zombie cpu间隔内情况,多核(按1): us、sy、id、wa、ni、hi(硬件中断)、si(软件中断)、st(stolen) | ||||
Memory Usage | 物理内存和虚拟内存情况 | ||||
输入行 | k:kill r:renice(调整任务优先级) o:列的顺序 f:显示哪些列 | u:筛选user i:忽略空闲和僵死进程 M:驻留内存大小(res)排序 P: %cpu排序 | T: time排序 q:quit A: S: | ||
列和Task | PID PPID S | 进程id | |||
父进程id | |||||
进程状态: D=不可中断的睡眠状态、R=运行、 S=睡眠 T=跟踪/停止、Z=僵尸进程 | |||||
COMMAND | 命令名/命令行 | ||||
UID USER RUSER GROUP | 进程所有者的用户id | ||||
进程所有者的用户名 | |||||
Real user name | |||||
进程所有者的组名 | |||||
PR NI | 优先级 | ||||
nice值。负值表示高优先级,正值表示低优先级 | |||||
%CPU TIME | 上次更新到现在的CPU时间占用百分比 | ||||
进程使用的CPU时间总计,秒 | |||||
%MEM VIRT SWAP RES CODE DATA | 进程使用的物理内存百分比 | ||||
进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES | |||||
进程使用的虚拟内存中,SWAP SPACE大小, kb。 | |||||
进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA | |||||
可执行代码占用的物理内存大小, kb | |||||
可执行代码以外的部分(数据段+栈)占用的物理内存大小, kb | |||||
nFLT | 页面错误次数 | ||||
nDRT | 最后一次写入到现在,被修改过的页面数。 | ||||
工具2:vmstat命令
vmstat | vmstat [options] [delay [count]] 第一个条是自开机到现在的平均值(不指定delay,仅显示此条) 下面的是delay时间间隔的抽样 ,procs、memory都是瞬时的情况 参数:vmstat –t(时间戳) | |
Procs | r | Runnable,ready to run(running / waiting for runtime)的进程数 |
B | uninterruptible wait(通常因为io)的进程数 | |
Memory | swpd | 使用的虚拟内存大小KB |
free | 空闲内存大小 | |
Buff | 被用作Buffer的内存大小 | |
Cache | 被用作cache的内存大小 | |
Swap | si、so | 磁盘分页到内存memory Swapped in 大小(kb/s) |
内存分页到磁盘memory Swapped out 大小。si so 趋于0,内存状态较好。 | ||
Io | bi、bo | 读、写磁盘的块数(block/s) |
System | in、cs | 每秒中断数 每秒上下文切换数 |
Cpu | us、sy、id、wa | Cpu时间% |
St | Time stolen from a virtual machine |
工具3:iostat命令
iostat | 从开机到当前执行时刻的统计信息 参数:iostat –x(详细信息) |
| ||
CPU 多核:平均 | %user | Cpu处理非内核% |
| |
%nice | 用户级别with a nice priority cpu使用% |
| ||
%sys | 内核使用cpu% |
| ||
%idle | 空闲时间的% |
| ||
Device | Device | 块设备名称 |
| |
请求数 | tps | 对应设备的每秒Io请求数 |
| |
rrqm/s wrqm/s | 每秒该设备的读、写请求被合并数 |
| ||
r/s、w/s | 每秒读rio、写wio请求数 |
| ||
数据量 | Blk_read/s Blk_wrtn/s Blk_read BLk_wrtn | 每秒读、写数据量(块数)。/读、写的总量。 Blk_read、BLk_wrtn从开机到现在 读写的总块数
块的大小:dumpe2fs –h /dev/sda1 |grep –F “Block size” |
| |
Kb_read/s Kb_wrtn/s Kb_read Kb_wrtn | 每秒读、写数据量(KB)/读、写的总量。----- iostat –k rMB/s、wMB/s (MB) ----- iostat –m |
| ||
rsec/s Wsec/s | 每秒读、写数据量(扇区) |
| ||
Avgrq-sz | 每个io请求的平均扇区数。 |
| ||
等待 | awaitr_await w_await | 平均每次设备i/o等待和操作的时间。 | ||
svctm | 平均每次设备io操作时间(接近await表示等待越少) | |||
Avgqu-sz | 平均io队列长度。 |
| ||
%util | 设备繁忙程度(80%很忙) |
|
工具4:strace命令
strace | 被进程调用的系统调用的执行情况,定位异常的具体位置。 先使用top命令定位异常的进程 | |
strace –T –p [pid] 显示每次调用所耗时间 |
| |
strace –c –p [pid] strace –c find/etc –name xxx (strace –c <command>)
统计每一系统调用的内核执行时间、次数和出错次数等 |
| |
|
| |
工具5:netstat命令
netstat | 各种网络相关信息,如网络连接,路由表,Interface Statistics\masquerade连接 | |
Active Internet connections | Recv-Q Send-Q | 接收但未做处理的字节数。 发送但还未被确认的字节数。 一般应是0。大于0表示正在队列中堆积数据 |
Active UNIX domain sockets | Proto | Proto显示连接使用的协议(tcp udp ) |
RefCnt | RefCnt表示连接到本套接口上的进程号 | |
Types | Types显示套接口的类型 | |
State | socket状态: LISTEN(服务端socket正在监听)ESTABLISHED(已建立连接) SYN_SENT(发送连接请求后等待匹配)SYN_RECV(收到连接请求等连接请求的确认) FIN_WAIT1(发送中断请求后,等中断确认),FIN_WAIT2(收到ack后,稍后中断) TIME_WAIT(收到fin、 ack,socket等关闭对剩余数据包的处理后再回复中断确认) CLOSE_WAIT(收到fin后回复了ack,由本地确认是否关闭连接) CLOSING(都中断了,但还有数据传输) LAST_ACK(被动关闭在发送了fin后,再等待对方的ack,收到ack后关闭连接) CLOSED(没有任何连接状态)unknown(未知) | |
Path | Path表示连接到套接口的其它进程使用的路径名。 | |
-a (all)显示所有listen和non-listen,默认不显示listen -t (tcp)仅显示tcp相关选项;-u (udp)仅显示udp相关选项 -n 拒绝显示别名,能显示数字的全部转化成数字。
-p 显示建立连接的pid和程序名 [root@centos0 xampp]# netstat -anp|grep mysql -e 显示扩展信息,例如uid等netstat -ae |grep mysql -s 按各个协议进行统计 -c 不停的刷新continuous listing。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
|
ps命令
ps | 详细的进程信息 Pstree\ \pmap | |
ps –elFL | F | Process flag |
S | 进程状态: S=sleeping、R=runnig、T=stopped ortraced、D=interuptable sleep,Z=zombie | |
UID PID PPID | ||
LWP | LWP[Light weight process,or thread]ID of the lwp being reported | |
C | Cpu利用率 | |
NLWP | Number of lwps(threads)in the process | |
PRI | Priority of theprocess | |
NI | Niceness level | |
ADDR | Process address space【不显示的】 | |
SZ | Code+data+stack 总的memory大小(kb) | |
WCHAN | Sleeping的Kernel function名。- 进程为运行,*多线程 | |
RSS | 驻留集大小、non-swapped物理内存使用大小 | |
PSR | Processor that process is currently assigned to. | |
STIME | 本次开始的时间 | |
TTY | 终端 | |
TIME | 自动启动占用的cpu时间 | |
CMD | 开启命令(有参数) | |
Ps –A :显示正在运行的所有进程 : |
工具6:Iptraf使用(待整理)
工具7:spotlight on linux使用(待整理)
各种命令
4.调优(还没有熟悉)
注:一点一点的调,调了用同一方式来衡量性能改变情况
修改各项配置相关信息前,要备份。记录每次修改,尤其是会影响其他方面的修改。
不要在生产环境调
调优完成后,继续监测其它指标,直到达到性能目标
调优后再评估性能情况,和基准对比。
ulimit调整内核参数
ulimit –a #用来显示当前的各种用户进程限制。linux对每个用户、系统限制了最大的进程数。
vi /etc/profile
ulimit –u 10000 #用户的最大进程数
ulimit –n 4096 #每个进程可以打开的文件数
ulimit –d unlimited #数据段长度
ulimit –m unlimited #最大内存大小
ulimit –s unlimited #堆栈的大小
ulimit –t unlimited #cpu时间
ulimit –v unlimited#虚拟内存
limits.conf
解除linux系统的最大进程数和最大文件打开限制
vi /etc/security/limits.conf,添加以下内容,注意添加完成后重启
*代表所有用户,也可以指定用户;noproc 代表最大的进程数;nofile 代表最大文件打开数
* soft noproc 11000
*hard noproc 11000
*soft nofile 8192
*hard nofile 20480
命令: show status like '%下面变量%';
Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量.
Aborted_connects 尝试已经失败的MySQL服务器的连接的次数.
Connections 试图连接MySQL服务器的次数.
Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量.
Delayed_insert_threads 正在使用的延迟插入处理器线程的数量.
Delayed_writes 用INSERT DELAYED写入的行数.
Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数.
Flush_commands 执行FLUSH命令的次数.
Handler_delete 请求从一张表中删除行的次数.
Handler_read_first 请求读入表中第一行的次数.
Handler_read_key 请求数字基于键读行.
Handler_read_next 请求读入基于一个键的一行的次数.
Handler_read_rnd 请求读入基于一个固定位置的一行的次数.
Handler_update 请求更新表中一行的次数.
Handler_write 请求向表中插入一行的次数.
Key_blocks_used 用于关键字缓存的块的数量.
Key_read_requests 请求从缓存读入一个键值的次数.
Key_reads 从磁盘物理读入一个键值的次数.
Key_write_requests 请求将一个关键字块写入缓存次数.
Key_writes 将一个键值块物理写入磁盘的次数.
Max_used_connections 同时使用的连接的最大数目.
Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块.
Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量.
Open_tables 打开表的数量.
Open_files 打开文件的数量.
Open_streams 打开流的数量(主要用于日志记载)
Opened_tables 已经打开的表的数量.
Questions 发往服务器的查询的数量.
Slow_queries 要花超过long_query_time时间的查询数量.
Threads_connected 当前打开的连接的数量.
Threads_running 不在睡眠的线程数量.
Uptime 服务器工作了多少秒.