C/C++Linux服务器开发/后台架构师知识体系整理
C/C++Linux服务器开发/后台架构师视频学习地址 Linux服务器开发/后台架构师学习群:960994558
1 基础命令和工具
grep搜索字符
grep 命令用于在文件中执行关键词搜索,并显示匹配的效果。部分常用选项
参数 | 作用 |
-c | 仅显示找到的行数 |
-i | 忽略大小写 |
-n | 显示行号 |
-v | 反向选择 – 仅列出没有关键词的行。v 是 invert 的缩写。 |
-r | 递归搜索文件目录 |
-C n | 打印匹配行的前后n行 |
在指定文件查找,查找login关键字
grep login ImUser.cpp
在多个文件中搜索
grep login ImUser.cpp MsgConn.cpp
在多个文件搜索的时候,可以使用通配符。在以 cpp结尾的文件中,搜索包含login 的行
grep login *.cpp
递归搜索目录下所有文件, 搜索 msg_server目录下所有文件,打印出包含 login的行。
grep login ‐r msg_server/
反向查找,查找文件中,不包含 hello 的行。
grep ‐v login ImUser.cpp
找出文件中包含 login的行,并打印出行号
grep ‐n login ImUser.cpp
找出文件中包含 login的行,打印出行号,并显示前后3行
grep ‐C 3 ‐n login ImUser.cpp
找出文件中包含 login的行,打印出行号,并显示前后3行,并忽略大小写
grep ‐C 3 ‐i ‐n login ImUser.cpp
find查找文件
通过文件名查找文件的所在位置,文件名查找支持 模糊匹配 find [指定查找目录] [查找规则] [查找完后执行的action] 常用的操作:
find . ‐name FILE_NAME
find /etc ‐maxdepth 1 ‐name passwd ##查找/etc/下名称中带有passwd的文件,查找一层
find /mnt ‐size 20K ##查找/mnt文件大小近似20k的文件
find /mnt ‐size +20K ##查找/mnt文件大小大于20k的文件
find /mnt ‐size ‐20K ##查找/mnt文件大小小于20k的文件
find /etc ‐maxdepth 2 ‐mindepth 2 ‐name *.conf ##查找/etc/下名称中带有*.conf的文件,且只查找第二层
find /mnt ‐type d ##按type查找/mnt中目录
find /mnt ‐type f ##按type查找/mnt中文件
find /mnt ‐cmin 10 ##查找/mnt中十分钟左右修改的
find /mnt ‐cmin +10 ##查找/mnt中十分钟以上修改的
find /mnt ‐cmin ‐10 ##查找/mnt中十分钟以内修改的
find /mnt ‐ctime 10 ##查找/mnt中十天左右修改的
find /mnt ‐ctime +10 ##查找/mnt中十天以上修改的
find /mnt ‐ctime ‐10 ##查找/mnt中十天以内修改的
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 的时候说明机器已经被 充分使用 了。
如果每个CPU内核的当前活动进程数 不大于3 的话,那么系统的 性能是良好 的。
如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。
如果你的linux主机是 1个双核CPU 的话,当 Load Average为6 的时候说明机器已经被 充分使用 了。
[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
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响应码
scp 远程拷贝
secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。
scp命令是Linux系统中功能强大的文件传输命令,可以实现从本地到远程,以及从远程到本地的双向文件传输,用起来非常方便,常用来在线上定位问题时将线卜的一些文件下载到本地进行详查,或者将本地的修改上传到服务器上。
使用方式:
sudo aptget install opensshserver
scp liaoqingfu@122.152.222.180:/home/liaoqingfu/test.txt . //下载文件
scp mi9.aac liaoqingfu@122.152.222.180:/home/liaoqingfu/ //上传文件
scp ‐r liaoqingfu@122.152.222.180:/home/liaoqingfu/ . //下载目录
scp ‐r test liaoqingfu@122.152.222.180:/home/liaoqingfu/ //上传目录
dos2unix和unix2dos
用于转换Windows和UNIX的换行符,通常在Windows系统h开发的脚本和配置,UNIX系统下都需要转换。使用方式:
dos2unix test.txt
unix2dos test.txt
#转换整个目录
find . ‐type f ‐exec dos2unix {} \;
find ./ type f
此命令是显示当前目录下所有的文件
sed 字符替换
命令格式1:sed ‘s/原字符串/新字符串/’ 文件
命令格式2:sed ‘s/原字符串/新字符串/g’ 文件
这两种命令格式的区别在于是否有个“g”。没有“g”表示只替换第一个匹配到的字符串,有“g”表示替换所有能匹配到的字符串,“g”可以认为是“global”(全局的)的缩写,没有“全局的”结尾就不要替换全部,
2 查看活动进程的命令
ps进程信息
ps用一于显示系统内的所有进程。
l或l 采用详细的格式来显示进程状况。
常用方式:ps elf 和ps ef
输出:
根据进程的名字或者其他信息,通过grep命令找到目标进程,也可以看到进程启动脚木的全路径。
top进程cpu内存信息
top命令用于查看活动进程的CPU和内存信息,能够实时显示系统中各个进程的资源占用情况,可以按照CPU、内存的使用情况和执行时间对进程进行排序。
使用方式:top
命令输出:
从输出可以看到整体的CPU占用率、CPU负载,以及进程占用CPU和内存等资源的情况。我们可以用以下所示的top命令的快捷键对输出的显示信息进行转换。
- t:切换报示进程和CPU状态信息。
- n:切换显示内存信息。
- r:重新设置一个进程的优先级。系统提示用户输人需要改变的进程PID及需要设置的进程优先级,然后输入个正数值使优先级降低,反之则可以使该进程拥有更高的优先级,即是在原有基础上进行相加,默认优先级的值是100
- k:终止一个进程,系统将提示用户输入需要终止的进程PID o
- s:改变刷新的时间间隔。
- u:查看指定用户的进程。
pidstat进程资源
pidstat用于监控全部或指定的进程占用系统资源的情况,包括CPU、内存、磁盘I/O、程切换、线程数等数据。
- u:表示查看cpu相关的性能指标
- w:表示查看上下文切换情况
- t:查看线程相关的信息,默认是进程的;常与w结合使用(cpu的上下文切换包括进程的切换、线程的切换、中断的切换)
- d:展示磁盘 I/O 统计数据
- p:指明进程号
使用方式:pidstat [option] interval [count]
使用范例:pidstat urd p 进程号
CPU信息
- %usr #用户层任务正在使用的CPU百分比(with or without nice priority ,NOT include time spent running a virtual processor)
- %system #系统层正在执行的任务的CPU使用百分比
- %guest #运行虚拟机的CPU占用百分比
- %CPU #所有的使用的CPU的时间百分比CPU #处理器数量
- Command #命令
内存信息
- PID #进程号
- minflt/s #每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
- majflt/s #每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,
这样的page fault为major page fault,一般在内存使用紧张时产生 - VSZ #该进程使用的虚拟内存(以kB为单位)
- RSS #该进程使用的物理内存(以kB为单位)
- %MEM #当前任务使用的有效内存的百分比
- Command #任务的命令名
磁盘I/O
- PID #进程号
- kB_rd/s #每秒此进程从磁盘读取的千字节数
- kB_wr/s #此进程已经或者将要写入磁盘的每秒千字节数
- kB_ccwr/s #由任务取消的写入磁盘的千字节数
- Command #命令的名字
上下文切换
- PID #PID号
- cswch/s #每秒自动上下文切换
- nvcswch/s #每秒非自愿的上下文切换
- Command #命令
3 内存命令
free内存
此命令用于显示系统内存的使用情况,包括总体内存、己经使用的内存;还可用于显示系统内核使用的缓冲区,包括缓冲(buffer)和缓存(cache) 等。
使用方式:free 命令输出:
- Mem 行(第二行)是内存的使用情况。
- Swap 行(第三行)是交换空间的使用情况。
- total 列显示系统总的可用物理内存和交换空间大小。
- used 列显示已经被使用的物理内存和交换空间。
- free 列显示还有多少物理内存和交换空间可用使用。
- shared 列显示被共享使用的物理内存大小。
- buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。
- available 列显示还可以被应用程序使用的物理内存大小。
free 与 available
在 free 命令的输出中,有一个 free 列,同时还有一个 available 列。这二者到底有何区别?
free 是真正尚未被使用的物理内存数量。至于 available 就比较有意思了,它是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性
能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available = free+ buffer + cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差。
加上 -h 选项
持续观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数:
CPU使用情况监控命令
vmstat
此命令显示关于内核线程、虚拟内存、磁盘I/O 、陷阱和CPU占用率的统计信息。
使用方式:vmstat
需要注意如下内容。
- buff:是I/O系统存储的磁盘块文件的元数据的统计信息。
- cache:是操作系统用来缓存磁盘数据的缓冲区,操作系统会自动一调节这个参数,在内存紧张时操作系统会减少cache的占用空间来保证其他进程可用。
- cs:参数表示线程环境的切换次数,此数据太大时表明线程的同步机制有问题。
- si和so较大时,说明系统频繁使用交换区,应该查看操作系统的内存是否够用。
- bi和bo代表I/O活动,根据其大小可以知道磁盘I/O的负载情况。
mpstat CPU信息
此命令用于实时监控系统CPU的一些统计信息,这些信息存放在/proc/stat文件中,在多核CPU系统里,不但能查看所有CPU的平均使用信息,还能查看某个特定CPU的信息。
使用方式:mpstat [-P {cpu|ALL}] [internal [count]]
当mpstat不带参数时,输出为从系统启动以来的平均值。
我们可以看到每个CPU核心的占用率、I/O等待、软中断、硬中断等。
输出各参数含义:
参数 | 含义 |
P {cpu l ALL} | 表示监控哪个CPU, cpu在[0,cpu个数1]中取值 |
internal | 相邻的两次采样的间隔时间 |
count | 采样的次数,count只能和internal一起使用 |
使用mpstat P ALL 5 2命令,表示每5秒产生一个报告,总共产生2个。
输出参数含义
当没有参数时,mpstat则显示系统启动以后所有信息的平均值。有interval时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个interval时间段的平均信息。 输出各参数含义:
参数 | 释义 | 从/proc/stat获得数据 |
CPU | 处理器ID | |
%usr | 在internal时间段里,用户态的CPU时间(%),不包含 nice值为负进程 | usr/total*100 |
%nice | 在internal时间段里,nice值为负进程的CPU时间(%) | nice/total*100 |
%sys | 在internal时间段里,核心时间(%) | system/total*100 |
%iowait | 在internal时间段里,硬盘IO等待时间(%) | iowait/total*100 |
%irq | 在internal时间段里,硬中断时间(%) | irq/total*100 |
%soft | 在internal时间段里,软中断时间(%) | softirq/total*100 |
%steal | 显示虚拟机管理器在服务另一个虚拟处理器时虚拟CPU处在非自愿等待下花费时间的百分比 | steal/total*100 |
%guest | 显示运行虚拟处理器时CPU花费时间的百分比 | guest/total*100 |
%gnice | gnice/total*100 | |
%idle | 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) | idle/total*100 |
- vmstat和mpstat 命令的差别:mpstat 可以显示每个处理器的统计,而 vmstat 显示所有处理器的统计。因此,编写糟糕的应用程序(不使用多线程体系结构)可能会运行在一个多处理器机器上,而不使用所有处理器。从而导致一个 CPU 过载,而其他 CPU 却很空闲。通过 mpstat 可以轻松诊断这些类型的问题。
- vmstat中所有关于CPU的总结都适合mpstat。当您看到较低的 %idle 数字时,您知道出现了 CPU 不足的问题。当您看到较高的 %iowait 数字时,您知道在当前负载下 I/O 子系统出现了某些问题。
4 监控磁盘I/O的命令
iostat IO状态
该命令用于监控CPU占用率、平均负载值及I/O读写速度等。
await指的是平均等待时间,一般都在10ms左右。
cpu的统计信息,如果是多cpu系统,显示的所有cpu的平均统计信息。
- %user:用户进程消耗cpu的比例
- %nice:用户进程优先级调整消耗的cpu比例
- %sys:系统内核消耗的cpu比例
- %iowait:等待磁盘io所消耗的cpu比例
- %idle:闲置cpu的比例(不包括等待磁盘I/O)
磁盘的统计参数
- tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。“一次传输"意思是"一次I/O请多个逻辑请求可能会被合并为"一次I/O请求”。"一次传输"请求的大小是未知的。
- kB_read/s:每秒从设备(drive expressed)读取的数据量;
- kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
- kB_read:读取的总数据量;
- kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。
显示扩展统计信息
每个输出消息含义:
- rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
- wrqm/s: 每秒对该设备的写请求被合并次数
- r/s: 每秒完成的读次数
- w/s: 每秒完成的写次数
- rkB/s: 每秒读数据量(kB为单位)
- wkB/s: 每秒写数据量(kB为单位)
- avgrqsz:平均每次IO操作的数据量(扇区数为单位)
- avgqusz: 平均等待处理的IO请求队列长度
- await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
- svctm: 平均每次IO请求的处理时间(毫秒为单位)
- %util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
常用用法
swapon查看分区使用情况
查看交互分区的使用情况使用方法:swapon s
我们在安装系统的时候已经建立了 swap 分区。swap 分区通常被称为交换分区,这是一块特殊的硬盘空间,即当实际内存不够用的时候,操作系统会从内存中取出一部分暂时不用的数据,放在交换分区中,从而为当前运行的程序腾出足够的内存空间。 也就是说,当内存不够用时,我们使用
swap 分区来临时顶替。这种“拆东墙,补西墙”的方式应用于几乎所有的操作系统中
一般来讲,swap 分区容量应大于物理内存大小,建议是内存的两倍,但不超过 2GB。
df硬盘使用情况
该命令用于查看文件系统的硬盘挂载点和空间使用情况。使用方式:df h
du目录文件大小
du常用的选项:
h:以人类可读的方式显示,显示M或K
a:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小
s:显示目录占用的磁盘空间大小,不显示其下子目录和文件占用的磁盘空间大小
c:显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和
du - a 显示目录和目录下子目录和文件占用磁盘空间的大小。直接使用a 以字节为单位,ha 如下图以M或K为结果显示。
du - s 显示当前所在目录大小
du - s - h home 显示home目录大小
du - c 显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和
du - lh - - max- depth=1 : 查看当前目录下一级子文件和子目录占用的磁盘容量。
5 查看网络信息和网络监控的命令
5.1 ifconfig查看和设置网络设备
该命令用于查看机器挂载的网卡情况。
- add<地址> 设置网络设备IPv6的IP地址。
- del<地址> 删除网络设备IPv6的IP地址。
- down 关闭指定的网络设备。
- <hw<网络设备类型><硬件地址> 设置网络设备的类型与硬件地址。
- io_addr<I/O地址> 设置网络设备的I/O地址。
- irq<IRQ地址> 设置网络设备的IRQ。
- media<网络媒介类型> 设置网络设备的媒介类型。
- mem_start<内存地址> 设置网络设备在主内存所占用的起始地址。
- metric<数目> 指定在计算数据包的转送次数时,所要加上的数目。
- mtu<字节> 设置网络设备的MTU。
- netmask<子网掩码> 设置网络设备的子网掩码。
- tunnel<地址> 建立IPv4与IPv6之间的隧道通信地址。
- up 启动指定的网络设备。
- broadcast<地址> 将要送往指定地址的数据包当成广播数据包来处理。
- pointopoint<地址> 与指定地址的网络设备建立直接连线,此模式具有保密功能。
- promisc 关闭或启动指定网络设备的promiscuous模式。
- [IP地址] 指定网络设备的IP地址。
- [网络设备] 指定网络设备的名称。
显示网络设备信息:ifconfig
lo是本地回绕
启动关闭指定网卡
配置IP地址
5.2 ping
ping命令是用于检测网络故障的常用命令,可以用来钡J试一台主机到另外一台主机的网络是否连通。语法
- -d 使用Socket的SO_DEBUG功能。
- -c<完成次数> 设置完成要求回应的次数。
- -f 极限检测。
- -i<间隔秒数> 指定收发信息的间隔时间。
- -I<网络界面> 使用指定的网络接口送出数据包。
- -l<前置载入> 设置在送出要求信息之前,先行发出的数据包。
- -n 只输出数值。
- -p<范本样式> 设置填满数据包的范本样式。
- -q 不显示指令执行过程,开头和结尾的相关信息除外。
- -r 忽略普通的Routing Table,直接将数据包送到远端主机上。
- -R 记录路由过程。
- -s<数据包大小> 设置数据包的大小。
- -t<存活数值> 设置存活数值TTL的大小。
- -v 详细显示指令的执行过程。
检测和主机是否连通
ping指定次数
① ping目标主机的域名和IP(ping会自动将域名转换为IP)
② 不带包头的包大小和带包头的包大小(参考“‐s”参数)
③ icmp_seq:ping序列,从1开始;如果数字不是按顺序递增也就意味着丢包了
ttl:剩余的ttl;见TTL解释
time: 响应时间,数值越小,连通速度越快;
④ 发出去的包数,返回的包数,丢包率,耗费时间;
⑤ 最小/最大/平均响应时间和本机硬件耗费时间;
TTL:每经过一个‘路由点‘,就把预先设定的这个TTL数值减1,直到最后TTL=1时报文就被扔掉,不向下转发。ping显示的TTL是指:被ping主机那里返回的报文,到了你这里,从它自己预设的TTL减小到还剩下多少。
telnet
telnet是TCP/IP协议族的一员,是网络远程登录服务的标准协议,帮助用户在本地计算机上连接远程主机。使用方式:telnet IP PORT
和ssh的区别
端口区别:telnet是23 ssh是22
本质:telnet是明码传输,ssh是加密传输
nc
nc是NetCat的简称,在网络调试工具中享有“瑞士军刀”的美誉,此命令功能丰富、短小精悍、简单实用,被设计成一款易用的网络工具,可通过
TCP/LJDP传输数据。
参数
-l 用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。
-p 暂未用到(老版本的nc可能需要在端口号前加-p参数,下面测试环境是centos6.6,nc版本是nc-1.84,未用到-p参数)
-s 指定发送数据的源IP地址,适用于多网卡机
-u 指定nc使用UDP协议,默认为TCP
-v 输出交互或出错信息,新手调试时尤为有用
-w 超时秒数,后面跟数字
常用示例
在不熟悉公司的防火墙设置时,也可以通过监听端口来确定指定的端口是否被封。
mtr连通性测试
mtr命令是Linux系统中的网络连通性测试工具,也可以用来检测丢包率。使用方式:mtr baidu.com
其中的第2列为丢包率,可以用来判断网络中两台机器的连通质量。
nslookup
这是一款检测网络中DNS服务器能否正确解析域名的工具命令,并且可以输出。使用方式: nslookup sina.com
从输出中可以看到,sina.com域名被正确解析到IP地址66.102.251.33。
traceroute
traceroute可以提供从用户的主机到互联网另一端的主机的路径,虽然每次数据包由同一出发点到达同一目的地的路径可能会不一样,但通常来说大多数情况下路径是相同的。
使用方式:traceroute sina.com
在输出中记录按序列号从1开始,每个记录代表网络一跳,每跳一次表示经过一个网关或者路由;我们看到每行有三个个时间,单位是毫秒,指的是这一跳需要的时间。
sar
sar是一个多功能的监控工具,使用简单,不需要管理员权限,可以输出每秒的网卡存取速度,适合线上排查问题时使用。使用方式: sar n DEV 1 1
从输出中可以看到网卡的读写速度和流量,在应急过程中可以用来判断服务器是否上量。此命令除了可以用于查看网卡的信息,还可以用来收集如下服务的状态信息。
- A:所有报告的总和。
- u:CPU利用率。
- v:进程、I节点、文件和锁表状态。
- d:硬盘的使用报告。
- r:没有使用的内存页面和硬盘快。
- g:串口I/O的情况。
- b:缓冲区的使用情况。
- a:文件的读写情况。
- c:系统的调用情况。
- R:进程的活动情况。
- y:终端设备的活动情况。
- w:系统的交换活动。
netstat
此命令显示网络连接、端口信息等,另外一个命令ss与netstat命令类似,不再单独介绍。
根据进程查找端口
(1) 根据进程名查找进程ID ps elf | grep 进程
输出
获得进程号为 24614 (master process)
(2) 根据进程ID查找进程开启的端口
netstat nap | grep 24614
根据端口查找进程
(1) 根据使用端口的进程号
netstat nap | grep 8080
获得进程ID为25901
(2) 根据进程ID查找进程的详细信息
iptraf强大的网络监控
iptraf是一个实时监控网络流量的交互式的彩色文本屏幕界面。它监控的数据比较全面,可以输出TCP连接、网络接口、协议、端口、网络包大小等信息,但是耗费的系统资源比较多,且需要管理员权限。
使用方式:sudo iptraf
在进入主界面之前可以选择不同的选项,在不同的选项下可以查看不同维度的网络信息。
安装方法:
tcpdump
tcpdump是网络状况分析和跟踪工具,是可以用来抓包的实用命令,使用前需要对TCP/IP有所熟悉,因为过滤使用的信息都是TCP/IP格式。显示来源IP或者目的IP为192.168.1.102的网络通信:
sudo tcpdump i eth0 host 192.168.1.102
显示去往102.168.1.102的所有ftp会话信息:
tcpdump i eth1 ‘dst 192.168.1.102 and (port 21 or 20)’
显示去往102.168.1.102的所有HTTP会话信息:
tcpdump ni eth0 ‘dst 192.168.1.102 and tcp and port 8080’
nmap
扫描某一主机打开的端口及端口提供的服务信息,通常用于查看本机有哪些端口对外提供服务,或者服务器有哪些端口对外开放。使用方式:nmap v A localhost
但实际能否进行连通还要看防火墙的设置
ethtool
ethtool用于查看网卡的配置情况。
命令使用格式:ethtool [option] interface
查看网卡:ethtool ens33 # PS在云主机检测不到网卡信息
范例
lsof
lsof是系统管理/安全的尤伯工具。将这个工具称之为lsof真实名副其实,因为它是指“列出打开文件(lists openfiles)”。而有一点要切记,在
Unix中一切(包括网络套接口)都是文件。
你可以使用它来获得你系统上设备的信息,你能通过它了解到指定的用户在指定的地点正在碰什么东西,或者甚至是一个进程正在使用什么文件或网络连接。具体可以使用man lsof查看帮助文档。
关键选项
- 默认 : 没有选项,lsof列出活跃进程的所有打开文件
- 组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数
- -a : 结果进行“与”运算(而不是“或”)
- -l : 在输出显示用户ID而不是用户名
- -h : 获得帮助
- -t : 仅获取进程ID
- -U : 获取UNIX套接口地址
- -F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)
获取网络信息
显示端口被某个程序占用
lsof -i:port
lsof -i :22 知道22端口现在运行什么程序
lsof -p 12 看进程号为12的进程打开了哪些文件
lsof -c abc 显示abc进程现在打开的文件,可以使用less进行分页,b 向后翻一页,d 向后翻半页
lsof abc.txt 显示打开文件abc.txt的进程
6 Linux系统的高级工具
pstack
pstack命令用来显示每个进程的调用栈。可以使用pstack来查看进程正在挂起的执行方法,也可以用来查看进程的本地线程堆栈,与JVM的jstack配合可以看到JVM线程运行的全景。
使用方式:pstack 进程ID
strace
系统调用工具,是Linux系统下的一款程序调试工具,用来监控一个应用程序所使用的 系统调用,通过它可以跟踪系统调用,让你熟悉一个Linux程序在背后是怎么工作的。 适用于想研究Linux底层的工作机制的场景。
参数
-c 统计每一系统调用的所执行的时间,次数和出错的次数等.
-d 输出strace关于标准错误的调试信息.
-f 跟踪由fork调用所产生的子进程.
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h 输出简要的帮助信息.
-i 输出系统调用的入口指针.
-q 禁止输出关于脱离的消息.
-r 打印出相对时间关于,每一个系统调用.
-t 在输出中的每一行前加上时间信息.
-tt 在输出中的每一行前加上时间信息,微秒级.
-ttt 微秒级输出,以秒了表示时间.
-T 显示每一调用所耗的时间.
-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-V 输出strace的版本信息.
-x 以十六进制形式输出非标准字符串
-xx 所有字符串以十六进制形式输出.
-a column
设置返回值的输出位置.默认 为40.
-e expr
指定一个表达式,用来控制如何跟踪.格式如下:
[qualifier=][!]value1[,value2]…
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号. 例如:
-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none.
注意有些shell使用!来执行历史记录里的命令,所以要使用\.
-e trace=set
只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
-e trace=file
只跟踪有关文件操作的系统调用.
-e trace=process
只跟踪有关进程控制的系统调用.
-e trace=network
跟踪与网络有关的所有系统调用.
-e strace=signal
跟踪所有与系统信号有关的 系统调用
-e trace=ipc
跟踪所有与进程通讯有关的系统调用
-e abbrev=set
设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set
将指 定的系统调用的参数以十六进制显示.
-e signal=set
指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set
输出从指定文件中读出 的数据.例如:
-e read=3,5
-e write=set
输出写入到指定文件中的数据.
-o filename
将strace的输出写入文件filename
-p pid
跟踪指定的进程pid.
-s strsize
指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-u username
以username 的UID和GID执行被跟踪的命令
实时查看进程
测试一段时间进程运行情况
输入strace -c -p 25901后过段时间按ctrl+c退出。
proc文件系统
Linux系统内核提供了通过/proc文件系统查看运行时内核内部数据结构的能力,也可以改变内核参数设置。
显示CPU信息: cat /proc/cpuinfo
显示内存信息:
cat /proc/meminfo
显示详细的内存映射信息: cat /proc/zoneinfo
显示磁盘映射信息: cat /proc/mounts
查看系统平均负载命令: cat /proc/loadavg
7 日志监控工具
tail
在实时日志上打印颜色,给每个状态给上不同的颜色,INF绿色、WARN黄色、ERROR红色
multitail
可同时开启多视窗看log,适合用在看部署在很多机器上的项目的log cS [color_scheme] : 可以选择输出的log的颜色,推荐使用goldengate,也可自定义(修改/etc/multitail.conf)
同时监控两个文件
分成两列监控两个文件
分成两列监控,第一列3个,第二列2个
合并两个文件
合并两个文件并且区分颜色
8 性能监控
pmap
pmap [options] PID
Pmap 提供了进程的内存映射,pmap命令用于显示一个或多个进程的内存状态。其报告进程的地址空间和内存状态信息。Pmap实际上是一个Sun
OS上的命令,linux仅支持其有限的功能。但是它还是对查看完整的进程地址空间很有帮助。我们需要PID或者运行的进程的唯一进程ID来查看进程内存状态,我们可以通过/proc或者常规命令比如top或ps得到它。
更详细的输出可以使用X参数。
这里的输出有很多的[ anon ]行,表示在磁盘上没有对应的文件,这些一般都是可执行文件或者动态库里的bss段。当然有对应文件的mapping也有可能是
anonymous,比如文件的数据段。关于程序的数据段和bss段的介绍请参考elf的相关资料。
接下来8个字段的含义分别如下:
- Size:表示该映射区域在虚拟内存空间中的大小。
- Rss:表示该映射区域当前在物理内存中占用了多少空间。
- Shared_Clean:和其他进程共享的未被改写的page的大小。
- Shared_Dirty: 和其他进程共享的被改写的page的大小。
- Private_Clean:未被改写的私有页面的大小。
- Swap:表示非mmap内存(也叫anonymous memory,比如malloc动态分配出来的内存)由于物理内存不足被swap到交换空间的大小。
- Pss:该虚拟内存区域平摊计算后使用的物理内存大小(有些内存会和其他进程共享,例如mmap进来的)。比如该区域所映射的物理内存部分同时也被另一个进程映射了,且该部分物理内存的大小为1000KB,那么该进程分摊其中一半的内存,即Pss=500KB。
nmon性能监控
centos安装
ubuntu安装
后台监控
为了配合性能测试,我们往往需要将一个时间段内系统资源消耗情况记录下来,这时可以使用命令在远程窗口执行命令:
./nmon/ nmon_x86_rhel5 f N m /nmon/log s 30 c 120
其中各参数表示:
- f 按标准格式输出文件:_YYYYMMDD_HHMM.nmon
- N include NFS sections
- m 切换到路径去保存日志文件
- s 每隔n秒抽样一次,这里为30
- c 取出多少个抽样数量,这里为120,即监控=120*(30/60/60)=1小时
根据小时计算这个数字的公式为:c=h3600/s,比如要监控10小时,每隔30秒采样一次,则c=103600/30=1200
该命令启动后,会在nmon所在目录下生成监控文件,并持续写入资源数据,直至360个监控点收集完成——即监控1小时,这些操作均自动完成,无需手工干 预,测试人员可以继续完成其他操作。如果想停止该监控,需要通过“#ps –ef|grep nmon”查询进程号,然后杀掉该进程以停止监控。
定时任务
除配合性能测试的短期监控,我们也可以实现对系统的定期监控,作为运营维护阶段的参考。定期监控实现如下:
- 执行命令:#crontab –e
- 在最后一行添加如下命令:
0 8 * * 1,2,3,4,5 /nmon/nmon_x86_rhel5 f N m /nmon/log s 30 c 1200
表示:
周一到周五,从早上08点开始,监控10个小时(到18:00整为止),输出到/nmon/log
测试指标可视化
nmon命令 生成的nmon可以通过工具进行可视化展示,一般可以使用nmonchart、nmon_analyser nmonchart
nmonechart 使用Google charts 生成html报告
glances系统监控
安装
执行:glances
除了很多命令行选项之外,Glances 还提供了更多的可在其运行时开关输出信息选项的 快捷键,下面是一些例子:
- a – 对进程自动排序
- c – 按 CPU 百分比对进程排序
- m – 按内存百分比对进程排序
- p – 按进程名字母顺序对进程排序i – 按读写频率(I/O)对进程排序d – 显示/隐藏磁盘 I/O 统计信息
- f – 显示/隐藏文件系统统计信息n – 显示/隐藏网络接口统计信息s – 显示/隐藏传感器统计信息
- y – 显示/隐藏硬盘温度统计信息
- l – 显示/隐藏日志(log)
- b – 切换网络 I/O 单位(Bytes/bits)
- w – 删除警告日志
- x – 删除警告和严重日志
- 1 – 切换全局 CPU 使用情况和每个 CPU 的使用情况
- h – 显示/隐藏这个帮助画面t – 以组合形式浏览网络 I/O u – 以累计形式浏览网络 I/O
- q – 退出(‘ESC‘ 和 ‘Ctrl&C‘ 也可以)
Glances 对于大多用户而言是个在系统资源上提供过多信息的工具。但是如果你是一个想要仅从命令行就能快速获取系统整体状况的系统管理员,那这个工具绝对是你的必备利器。
w
显示谁登录了系统并执行了哪些程序。
Linux服务器开发/架构师面试题、学习资料、教学视频和学习路线图(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享有需要的可以自行添加学习交流群960994558