C++面试总结之linux(一):命令

1.linux如何查cpu使用率

a.方法一:top命令

在终端中直接执行top命令,即可看到cpu的使用率。(h查看命令帮助,q退出top). 如果是多核CPU,希望查询每个CPU的使用率,可以在top命令的界面,按数字键1,即可看到其它CPU的使用率

Top –H –p 1003 //查看线程

b. 方法二:vmstat命令

vmstat是一个虚拟内存命令,但是本身也可以看到cpu的使用率,可以执行vmstat -w-w参数可以等宽输出信息,便于用户查询。

c. 方法三:sysstate工具包

首先要先安装sysstate工具包,如果系统中没有安装,则需要自行安装,以deepin linux为例,执行如下命令安装

sudo apt-get install sysstate

在sysstate工具包中,有一个sar命令,可以根据时间和次数来查看cpu使用率,在一般的测试中是非常有用的。比如执行下面的命令:

sar -u 1 5

使用sar命令,如果要获取某个CPU的使用率,可以通过-P参数来指明。

在sysstate工具包中,还有一个mpstat,它与sar命令的使用方法类似,但是却可以看到nice值等更多的信息。

d.方法四:dstat命令

如果没有dstat命令,则需要进行安装。以deepin linux为例:

sudo apt-get install dstat

安装完成后,使用dstat命令的-c参数,即只显示cpu状态信息。 

2.进程管理的一些命令

ps -l命令能查看当前 bash 下的相关进程全部信息

pstree
ps -aux 

监控进程的变化:

top strace

我们需要通过以下的方法来查看进程的详细信息:

Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为exe的文件即记录了绝对路径,通过ll或ls –l命令即可查看。/proc/[pid] 目录各文件

ll /proc/PID

3. linux如何修改进程优先级?(nice命令、top命令

(1)一开始执行程序就指定nice值:nice

nice -n -5 /usr/local/mysql/bin/mysqld_safe &

语  法:nice [-n <优先等级>][--help][--version][执行指令] 
参  数:-n<优先等级>或-<优先等级>或–adjustment=<优先等级>  设置欲执行的指令的优先权等级。等级的范围从-20-19,其中-20最高,19最低,只有系统管理者可以设置负数的等级。

(2)调整已存在进程的nice:renice

renice -5 -p 5200
//PID为5200的进程nice设为-5

语  法:renice [优先等级][-g <程序群组名称>...][-p <程序识别码>...][-u <用户名称>...]

参  数:-g <程序群组名称>  使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。

                  -p <程序识别码>  改变该程序的优先权等级,此参数为预设值。

                 -u <用户名称>  指定用户名称,修改所有隶属于该用户的程序的优先权。

(3)也可以用top命令更改已存在进程的nice:

top#进入top后按“r”–>输入进程PID–>输入nice值

4.linux下性能监控命令uptime介绍,平均负载的具体含义是什么?建议看server load概念。

uptime命令能够打印系统总共运行了多长时间和系统的平均负载。uptime命令可以显示的信息显示依次为:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。

系统平均负载是指在特定时间间隔内运行队列中的平均进程数。如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。

如果你的linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。

5.linux下如何调试程序?说到gdb,具体如何调试?如何查看core文件中的堆栈信息等(bt指令)。

bt:看函数调用栈信息,可以解决内存泄漏等问题

g++ -g 1.cpp app
gdb app core
backtrace
bt

6. Linux Cpu占用高调试方法

(1)用top命令确定 有问题的pid

(2)用top -H -p pid命令查看进程内各个线程占用的CPU百分比

top -H -p 14094

(3)用gdb来attach目标进程

gdb
gdb>>attach 2907

调试完指定进程后,可以运行detach命令来让GDB释放该进程,该进程得以继续运行。

7.Linux命令top

C++面试总结之linux(一):命令_第1张图片

统计信息区 

第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:

19:53:07 — 当前系统时间
Up 29 min — 系统已运行时间    1 users — 当前有1个用户登录系统
load average:后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第二行,Tasks — 任务(进程),具体信息说明如下:

系统现在共有235个进程,其中处于运行中的有1个,233个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有1个。

第三行,cpu状态信息,具体属性说明如下:

0.1%us — 用户空间占用CPU的百分比。
0.1%sy — 内核空间占用CPU的百分比。
0.0%ni — 改变过优先级的进程占用CPU的百分比
99.8%id — 空闲CPU百分比
0.0%wa — IO等待占用CPU的百分比
0.0%hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.0%si — 软中断(Software Interrupts)占用CPU的百分比

第四行,内存状态,具体信息如下:

32949016k total — 物理内存总量(32GB)
14411180k used — 使用中的内存总量(14GB)
18537836k free — 空闲内存总量(18GB)
169884k buffers — 缓存的内存量 (169M)

第五行,swap交换分区信息,具体信息说明如下:

32764556k total — 交换区总量(32GB)
0k used — 使用的交换区总量(0K)
32764556k free — 空闲交换区总量(32GB)
3612636k cached — 缓冲的交换区总量(3.6GB)

备注:

第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。

如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:18537836k +169884k +3612636k = 22GB左右。

对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。

第六行,空行。

第七行以下:各进程(任务)的状态监控,项目列信息说明如下:

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 — 进程名称(命令名/命令行)

8.Linux命令vmstat

r :运行队列(多少个进程分配到CPU)。超过CPU数目,出现CPU瓶颈。
b :阻塞的进程。
swpd: 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把
耗内存的任务迁移到其他机器。
free:空闲的物理内存的大小。
buff :Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存。
Cache:直接用来记忆我们打开的文件,给文件做缓冲。(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的
缓存,是为了提高程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
si:每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存
充裕,一切正常。
so:每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi:块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte 
bo:块设备每秒发送的块数,bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in:每秒CPU的中断次数,包括时间中断
cs:每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太
大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的
测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值
了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系
统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有
充分利用,是不可取的。
us:用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy:系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id:空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wt:等待IO CPU时间。
vmstat 2 :每隔2秒刷新一次

9.Linux命令find/whereis/locate

(1) http://man.linuxde.net/find

(2) whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

和find相比,whereis查找的速度非常快,这是因为linux系统会将系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。 

但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。

whereis [-bmsu] [BMS 目录名 -f ] 文件名

-b   定位可执行文件。
-m   定位帮助文件。
-s   定位源代码文件。
-u   搜索默认路径下除可执行文件、源代码文件、帮助文件以外其它文件。
-B   指定搜索可执行文件的路径。
-M   指定搜索帮助文件的路径。
-S   指定搜索源代码文件的路径。

(3) locate和find找寻档案的功能类似,但locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在 执行loacte时直接找该索引,查询速度会较快,索引数据库一般是由操作系统管理,但也可以直接下达update强迫系统立即修改索引数据库。

10.Linux命令:lsof

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

lsof [参数][文件]

-a 列出打开文件存在的进程
-c<进程名> 列出指定进程所打开的文件
-g  列出GID号进程详情
-d<文件号> 列出占用该文件号的进程
+d<目录>  列出目录下被打开的文件
+D<目录>  递归列出目录下被打开的文件
-n<目录>  列出使用NFS的文件
-i<条件>  列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件
-u  列出UID号进程详情
-h 显示帮助信息
-v 显示版本信息

11.Linux命令:free/memstat

(1)Free:

-b  以Byte为单位显示内存使用情况。 
-k  以KB为单位显示内存使用情况。 
-m  以MB为单位显示内存使用情况。
-g   以GB为单位显示内存使用情况。 
-o  不显示缓冲区调节列。 
-s<间隔秒数>  持续观察内存使用状况。 
-t  显示内存总和列。 
-V  显示版本信息

(2)Memstat(查看内存的工具,需要下载):

直接运行 memstat -w 即可列出当前所有共享库的信息.

12.Linux命令:iostat/ df/ du

(1)Df命令: 

-a:--all,显示所有的文件系统,包括虚拟文件系统,参考示例2。 
-B:--block-size,指定单位大小。比如1k,1m等,参考示例3。 
-h:--human-readable,以人们易读的GB、MB、KB等格式显示,参考示例4。 
-H:--si,和-h参数一样,但是不是以1024,而是1000,即1k=1000,而不是1k=1024。 
-i:--inodes,不用硬盘容量,而是以inode的数量来显示,参考示例5。 
-k:以KB的容量显示各文件系统,相当于--block-size=1k。 
-m:以KB的容量显示各文件系统,相当于--block-size=1m。 
-l:--local,只显示本地文件系统。 
--no-sync:在统计使用信息之前不调用sync命令(默认)。 
-sync:在统计使用信息之前调用sync命令。 
-P:--portability,使用POSIX格式显示,参考示例6。 
-t:--type=TYPE,只显示指定类型的文件系统,参考示例7。 
-T:--print-type,显示文件系统类型,参考示例8。 
-x:--exclude-type=TYPE,不显示指定类型的文件系统。

(2)Du命令:

du命令是查看当前指定文件或目录(会递归显示子目录)占用磁盘空间大小

13.Linux命令:netstat/ ifconfig/ iptables

网络状态查看命令:netstat ifconfig iptables

Iptables (用来实现防火墙) : https://www.linuxidc.com/Linux/2016-09/134832.htm

14.Linux命令grep/ sed/ cut/ awk

awk 命令:awk 是一个强大的文本分析工具,使用 awk 命令处理一个或者多个文件时,它会依次读取文件的每一行内容, 然后对其进行处理,awk 其实就是一个脚本编程语言。

15.Linux命令:tcpdump

https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html

抓包工具

你可能感兴趣的:(C++面试总结)