创作人QQ:851301776, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点!
个人座右铭:
1.没有横空出世,只要厚积一定发。
2.你可以学历不高,你可以不上学,但你不能不学习
备注:系统命令主要是我们调试和找问题的过程中使用,本篇主要是为了自己可以知道有哪些命令,在以后使用的过程中方便查找。
前言: (1)课程重点: Linux cpu、硬盘、内存、网络状态监控 Linux cpu、硬盘、内存、网络性能测试 Linux cpu、硬盘、内存、网络性常见性能问题的排查 (2)推荐: Netflix 高级性能架构师 Brendan Gregg的博客: http://www.brendangregg.com 一、Linux常用命令 主要分为针对以下几个方面: (1)CPU (2) 内存 (3)磁盘 (4) 网络 1.监控常用的命令:
(1) free (2) ping (3) vmstat (VirtualMeomoryStatistics,虚拟内存统计) (4) iostat 用 于报告*处理器(CPU)统计信息和整个系统、适配器、tty 设备、磁盘和 CD-ROM 的输 ⼊/输出统计信息 (5) dstat 显示了cpu使用情况,磁盘io情况,网络发包情况和换页情况,输出是彩色的,可读性较强,相对于vmstat和iostat的输⼊更加详细且较为直观。 (6) pidstat 主要用于监控全部或指定进程占⽤系统资源的情况,如CPU,内存、设备IO、任务切换、线程 等。 (7) top 命令的汇总区域显示了五个方面的系统性能信息:负载、进程状态、cpu使用率、内存使用、交换 分区。 (8) iotop LINUX进程实时监控⼯具, 界面风格类似top命令(9) htop 是Linux系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台或者X终端中),需要ncurses。
(10) mpstat Report processors related statistics. 报告CPU的统计信息。 (11) netstat 用 于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。 (12) ps 显示当前进程的状态 (13)strace : Trace system calls and signals。 跟踪程序执行过程中产生的系统调用及接收到的信号,帮助分析程序或命令执行中遇到的异常情况。 (14) ltrace A library call tracer 跟踪进程调⽤库函数的情况 (15) uptime 能够打印系统总共运行了多长时间和系统的平均负载,uptime命令最后输出的三个数字的含义分别是1分钟,5分钟,15分钟内系统的平均负荷 (16) lsof (list open files)是一个列出当前系统打开文件的工具。 (17) perf 是Linux kernel自带的系统性能优化⼯具。优势在于与Linux Kernel的紧密结合,它可以最先应用到加入Kernel的new feature,用于查看热点函数,查看cashe miss的比率,从而帮助开发者来优 化程序性能。 (18) tcpdump (19) sar (20)blktrace 2.测试二、基础命令和工具
1.grep搜索字符
grep 命令⽤于在⽂件中执⾏关键词搜索,并显示匹配的效果。部分常⽤选项2.find查找⽂件
通过文件名查找文件的所在位置,文件名查找支持模糊匹配
格式:find [指定查找目录] [查找规则] [查找完后执行的action]
常⽤的操作: (1)find . -name FILE_NAME (2)find . - i name FILE_NAME 忽略文件名称大小写 (3)find /etc -maxdepth 1 -name passwd ##查找/etc/下名称中带有passwd的文件,查找一层 (4)find /mnt -size 20K ##查找/mnt文件大小近似20k的文件 (5)find /mnt -size +20K ##查找/mnt文件大小大于于20k的文件 (6)find /mnt -size -20K ##查找/mnt文件大小小于于20k的文件 (7)find /etc -maxdepth 2 -mindepth 2 -name *.conf ##查找/etc/下名称中带有*.conf的文件,且只 查找第二层 (8)find /mnt -type d ##按type查找/mnt中目录 (9)find /mnt -type f ##按type查找/mnt中文件 (10)find /mnt -cmin 10 ##查找/mnt中十分钟左右修改的 (11)find /mnt -cmin +10 ##查找/mnt中十分钟以上修改的 (12)find /mnt -cmin -10 ##查找/mnt中十分钟以内修改的 (13)find /mnt -ctime 10 ##查找/mnt中十天左右修改的 (14)find /mnt -ctime +10 ##查找/mnt中十天以上修改的 (15)find /mnt -ctime -10 ##查找/mnt中十天以内修改的 3、 ls显示文件 -t 可以查看最新修改的时间 -l 每显示一个条目 -h 可以结合显示文件的GB,MB等(human); -R 递归显示 -n 显示组id和gid 练习: ls -lt 按最新修改的时间排序,新修改的在前面显示。 ls -ltR 按最新修改的时间排序,新修改的在前面显示,并显示子目录的文件信息 ls -lh 以单位显示文件大小 4 wc命令 wc命令用于计算字数。 利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、 或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。 语法: wc [-clw][--help][--version][文件...] 参数: -c或--bytes或--chars 只显示Bytes数。 -l或--lines 只显示行数。 11 -w或--words 只显示字数。 --help 在线帮助。 --version 显示版本信息。 练习: wc testfile # testfile⽂件的统计信息 7 92 607 testfile # testfile⽂件的⾏数为7、单词数92、字节数607 wc -l testfil 5 uptime机器启动时间+负载 查看机器的启动时间、登录⽤户、平均负载等情况,通常用于在线上应急或者技术攻关中,确定操作系统 重启时间。 [root@VM_0_3_centos src]# uptime 13:01:52 up 46 days, 22:03, 4 users, load average: 0.13, 0.08, 0.05 从上⾯的输出可以看到如下信息 当前时间: 13:01:52 系统已经运行的时间:43天22小时3分钟。 前在线用户:4个用户, 是总连接数量,不是不同用户数量(开一个终端连接就算一个用户) 。 系统平均负载:0.13 , 0.08, 0.05,为最近1分钟、5分钟、15分钟的系统负载情况。 系统的平均负载是指在特定的时间间隔内队列中运⾏的平均进程数。如果一个进程满足以条件,它就会位 于运行队列中。 它没有在等待I/O操作的结果。 它没有主动进入等待状态(也就是没有调用’wait'相关的系统API ) 没有被停止(例如:等待终止)。 如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能还算可以支持。 如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。 如果你的linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。 负载说明(现针对单核情况,不 是单核时则乘以核数 ): load<1:没有等待 load==1:系统已无额外的资源跑更多的进程了 load>1:进程都堵着等待资源 注意: load < 0.7时:系统很闲,要考虑多部署⼀些服务 0.7 < load < 1时:系统状态不错 load == 1时:系统马上要处理不多来了,赶紧找⼀下原因 load > 5时:系统已经非常繁忙了 不同load值说明的问题 1)1分钟 load >5,5分钟 load <3,15分钟 load <1 短期内繁忙,中长期空闲,初步判断是一个抖动或者是拥塞前兆 2)1分钟 load >5,5分钟 load >3,15分钟 load <1 短期内繁忙,中期内紧张,很可能是一个拥塞的开始 3)1分钟 load >5,5分钟 load >5,15分钟 load >5 短中⻓期都繁忙,系统正在拥塞 4)1分钟 load <1,5分钟Load>3,15分钟 load >5 短期内空闲,中长期繁忙,不用紧张,系统拥塞正在好转 补充: 查看cpu信息:cat /proc/cpuinfo 直接获取cpu核数:grep 'model name' /proc/cpuinfo | wc -l 6 ulimit 用户资源 Linux系统对每个登录的用户都限制其最大进程数和打开的最大文件句柄数。为了提高性 能,可以根据硬件 资源的具体情况设置各个用户的最大进程数和打开的最大文件句柄数。可以用 ulimit -a 来显示当前的各种 系统对用户使用资源的限制: [root@VM_0_3_centos ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7269 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 100001 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 65535 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 设置用户的最大进程数: ulimit -u 1024 设置用户可以打开的最大文件句柄数: ulimit -n 65530 7 curl http 由于当前的线上服务较多地使用了RESTful风格的API,所以集成测试就需要进行HTTP调用,查看返回的 结果是否符合预期,curl命令当然是首选的测试方法。 使用方式: curl -i "http://www.sina.com" # 打印请求响应头信息 curl -I "http://www.sina.com" # 仅返回http头 curl -v "http://www.sina.com" # 打印更多的调试信息 curl -verbose "http://www.sina.com" # 打印更多的调试信息 curl -d 'abc=def' "http://www.sina.com" # 使用post方法提交http请求 curl -sw '%{http_code}' "http://www.sina.com" # 打印http响应码 8 scp远程拷贝 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。 scp命令是Linux系统中功能强的⽂件传输命令,可以实现从本地到远程,以及从远程到 本地的双向文件传输,用起来非常方便,常用来在线上定位问题时将线卜的一些文件下载到本地进行详查,或者将本地的 修改上传到服务器上。 使用方式: sudo apt-get install openssh-server scp liaoqingfu@122.152.222.180:/home/liaoqingfu/test.txt . //下载122.152.222.180的文件 scp mi9.aac liaoqingfu@122.152.222.180:/home/liaoqingfu/ //上传文件到122.152.222.180 scp -r liaoqingfu@122.152.222.180:/home/liaoqingfu/ test . //下载test整个目录到本地 scp -r test liaoqingfu@122.152.222.180:/home/liaoqingfu/ //上传本地test整个目录到 122.152.222.180 9 dos2unix和unix2dos 用于转换Windows和UNIX的换行符,通常在Windows系统h开发的脚本和配置,UNIX系统下都需要转 换。 使用方式: dos2unix test.txt unix2dos test.txt #转换整个目录 find . -type f -exec dos2unix {} \; find ./ -type f此命令是显示当前目录下所有的文件 10 sed 命令格式1:sed 's/原字符串/新字符串/' 文件 命令格式2:sed 's/原字符串/新字符串/g' 文件 这两种命令格式的区别在于是否有个“g”。 没有“g”表示只替换第一个匹配到的字符串 ,有“g”表示替换所有能匹配到的字符串,“g”可以认为是“global”(全局的)的缩写,没有“全局的”结尾就不要替换全部。 sed命令是用来批量修改文本内容的,比如批量替换配置中的某个ip。 sed命令在处理时,会先读取一行,把当前处理的行存储在临时缓冲区中,处理完缓冲区中的 内容后,打印到屏幕上。然后再读入下一行,执行下一个循环。不断的重复,直到文件末尾。 简单模式
命令:
这里的命令是指s。也就是substitute的意思:
查找匹配:查找部分会找到要被替换的字符串。这部分可以接受纯粹的字符串,也可以接受正则表达式。看下面的例子a 查找范围行中的字符串 a 。[a,b,c] 从范围行里查找字符串a或者b或者c。
命令类似:
sed 's/a/b/g' file
sed 's/[a,b,c]/<&>/g' file替换
是时候把找出的字符串给替换掉了。本部分的内容将替换查找匹配部分找到的内容。
可惜的是,这部分不能使用正则。常用的就是精确替换。比如把a替换成b。
但也有高级功能。和java或者python的正则api类似,sed的替换同样有 Matched Pattern 的含义,同 样可以得到Group,不深究。常用的替位符,就是 & 。
& 号,再重复一遍。当它用在替换字符串中的时候,代表的是原始的查找匹配数据。
[&] 表明将查找到的数据使用[]包围起来。“&” 表明将查找的数据使用””包围起来。 下面这条命令,将会把文件中的每一行,使用引号包围起来。 sed 's/.*/"&"/' file flag 参数 这些参数可以单个使用,也可以使用多个,仅介绍最常用的 g 默认只匹配行中第一次出现的内容,加上g,就可以全文替换了。常用。p 当使用了 -n 参数, p 将仅 输出匹配行内容。w 和上面的w模式类似,但是它仅仅输出有变换的行。i 这个参数比较重要,表示忽略大小写。e 表示将输出的每一行,执行一个命令。不建议使用,可以使用xargs配合完成这种功能。 看两个命令的语法: sed -n 's/a/b/gipw output.txt' file sed 's/^/ls -la/e' file
^M 就是\r
更进⼀步学习: https://github.com/Black-Gold/Learn/blob/1ee76ca2a9bbbbfe04850a1ccc9b9658e1eb39de/Linux_man_cn/sed.md 11. awk awk 同 sed 命令类似,只不过 sed 擅长取行, awk 命令擅长取列。 原理:一般是遍历一个文件中的每一行,然后分别对文件的每一行进行处理 用法: awk [ 可选的命令行选项 ] 'BEGIN{ 命令 } pattern{ 命令 } END{ 命令 }' 文 件名1 $ awk 'BEGIN{OFMT="%.2f";print 1.2567,12E-2}' 2 1.26 0.12 这里OFMT是个内置变量,初始化数字输出格式,保留小数点后两位。 END 添加结尾符 和BEGIN用法类似 1 $ echo ok | awk '{print $1}END{print "end"}' 2 ok 3 end 数据计算 1 $ awk 'BEGIN{print "姓名 语⽂ 数学 英语 总成绩 "; \ 2 sum1=0;sum2=0;sum3=0;sumall=0} \ 3 {printf "%5s%5d%5d%5d%5d\n",$1,$2,$3,$4,$2+$3+$4;\ 4 sum1+=$2;sum2+=$3;sum3+=$4;sumall+=$2+$3+$4}\ 5 END{printf "%5s%5d%5d%5d%5d\n","总成绩 ",sum1,sum2,sum3,sumall}'\ 6 score.txt 7 姓名 语⽂ 数学 英语 总成绩 8 tom 60 60 60 180 9 kitty 90 95 87 272 10 jack 72 84 99 255 11 总成绩 222 239 246 707 因为命令太长,末尾用 \ 符号换行。 BEGIN体里输出表头,并给四个变量初始化0 pattern体里输出每一行,并累加运算 END体里输出总统计结果 当然了,一个正常人在用linux命令的时候是不会输入那么多格式化符号来对齐的,所以新命令又来了: column -t (鬼知道我为什么会记得这么多乱七八糟的命令。) 范例:网络状态统计 本小节,采用awk统计netstat命令的一些网络状态,来看一下awk语言的基本要素。netstat的输出类似 于: