一.题目
查看资源中的Linux进程管理实验,认真阅读本文,并对其中的命令一一进行实验,截图,并给出每条命令的心得体会,。 1.监控进程的状态,ps, top,kill命令的使用,以及硬中断和软中断的理解,通过查看/proc/softirqs来观察中断的运行情况。
2.进程优先级,top/ps,nice/renice命令的使用(4个命令都用一下)。
3.企业案例,Linux假死是怎么回事,深刻理解fork()是怎么回事,oom killer是干什么?出现假死情况怎么办?如何分析故障?截图说明
4.后台进程管理,安装screen和nohup命令,并使用,截图,并给出心得体会
5.系统平均负载,使用stress、mpstat、pidstat命令,找出平均负载升高的根源
6.参考P81页的代码,编写程序,父进程打印控制菜单,并接受命令(上面列出的命令至少5个),然后创建子进程,让子进程去处理任务,而父进程继续打印菜单并接受命令。说明调试过程以及新的体会,并给出截图
二.解答
1.监控进程的状态,ps, top,kill命令的使用,以及硬中断和软中断的理解,通过查看/proc/softirqs来观察中断的运行情况。
(1)ps(Process Status)进程查看命令,用来列出系统中当前运行的进程,并且根据不同命令参数,ps命令含义也不同,ps命令查看的是进程的静态信息,即查看那一刻进程信息内容,比如 -a:显示所有用户的进程 -u:显示用户名和启动时间 -x:显示 没有控制终端的进程 -e:显示所有进程,包括没有控制终端的进程 -l:长格式显示 -w:宽行显示,可以使用多个w进行加宽显示3261 -aux:查看正在运行的所有进程  可以看出系统正在运行的所有进程的一些信息,USER进程所属用户、PID进程ID、CPU占用率、内存占用率、虚拟和物理内存占用大小、TYY终端类型、STAT进程状态、START进程启动时刻、TIME进程运行时长、COMMAND启动进程的命令。  列出当前用户态进程,图形界面进程终端进程。 (2) top命令可以实时动态地查看系统的整体运行情况,相比于ps命令,top命令展示出的进程信息会定时刷新,实时增加或减少目前正在运行的进程。Top命令也有一些参数: -b:以批处理模式操作; -c:显示完整的治命令; -d:屏幕刷新间隔时间; -I:忽略失效过程; -s:保密模式;  如图是对应图片左上角显示时间时实时进程状态,显示CPU,MEM SWAP(虚拟内存)的占用率以及进程的当前状态。  默认进程top进程刷新时间是3s,如图是不同时间段不同进程信息。 在top命令展示进程同时还可以与系统互动,比如k交互命令来杀死一个进程。  终端便关闭了。 (3)kill命令:用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。 Kill命令也有许多指令,如停止一个进程,kill -9 ipd,关闭该web页面进程。   即关闭了web进程。 kill -18与kill -19互为相反操作,-19为暂停进程,-18为继续进程,这两个指令意思为进程仍在执行,只是状态有R(运行状态)变为T(暂停状态),如图   软硬中断的理解: 中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚,处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。 硬中断是由硬件产生的中断信号比如键盘,磁盘等,调用硬中断处理程序进行处理,可以短时间快速处理工作。 软中断是由硬中断正在处理的程序或进程调度程序等软件所发出的中断信号,调用软中断处理程序处理。  如图为内核中软中断运行情况,每个CPU对应一个软中断内核线程,不同类型中数字代表中断次数,可以看出CPU0的网卡收发、接收中断、TIMER定时终端、内核调度、RCU锁等软中断类型的中断次数。
2.进程优先级,top/ps,nice/renice命令的使用(4个命令都用一下)
进程调度静态优先级即NI是从-20到19,一共40个级别,数字越大,表示进程的优先级越低,默认时候,进程的优先级是0,可通过nice与renice命令来改变该进程静态优先级。 PR与PRI为动态优先级,linux实现了140个优先级范围,取值范围从0-139,值越小,优先级越高,NI值的-20到19映射到实际的优先级范围是100-139,一般进程取值范围也不会超出100-139的范围,除非这个进程是一个实时进程,那么它的优先级取值才会变成0-99这个范围中的一个 PRI即进程的优先级,此值越小进程的优先级别越高。而NI,也就是我们所要说的nice值(通过nice命令设置),其表示进程可被执行的优先级的修正数值。如前面所说,PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice。 Top命令下优先级查看   如图为使用Top命令和ps-el命令查看进程的优先级,可以看出各个进程的静态优先级和动态优先级。 Nice与Renice是用来调整进程优先级, 如图为使用nice命令调整top进程的NI优先级得到的新PR   使用renice命令调整优先级后为   通过修正NI值得到新的PR值。
3.企业案例,Linux假死是怎么回事,深刻理解fork()是怎么回事,oom killer是干什么?出现假死情况怎么办?如何分析故障?截图说明
假死,就是能ping通,但ssh(安全外壳协议,建立在应用层基础上的安全协议,专为远程登录会话和其他网络服务提供安全性的协议,可有效防止远程管理过程中的信息泄露问题)上不去;任何其他操作也都没反应,包括nginx(一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务)也打不开页面。作为多任务操作系统,且在fd保护、进程数保护、最大内存保护等机制下,忙到ssh连不上也不容易。
理解fork()是怎么回事?oom killer是干什么? Linux的fork()使用写时拷贝页实现,也就是说,父进程和子进程共享同一个资源拷贝,只有当数据发生改变时,数据才会发生复制。当fork很多进程时,系统会变得很慢,但是ssh还是能连上。分配很多内存,但是内存多到一定程度时,oom killer就会把进程杀掉,ssh又可以工作了。
出现假死怎么办 把系统搞成假死的方法:主进程分配固定内存,然后不停的fork,并且在子进程里面sleep(100)。也就是当主进程不停fork的时候,很快会把系统的物理内存用完,当物理内存不足时候,系统会开始使用swap(指的是一个交换分区或文件,交换分区主要是在内存不够用的时候,将部分内存上的数据交换到swap空间上,以便让系统不会因内存不够用而导致oom(out of memory)或者更致命的情况出现);当swap不足时会出发oom killer进程;当oom killer杀掉了子进程,主进程会立刻fork新的子进程,并再次导致内存用完,再次触发oom killer进程,就进入死循环。oom killer这种系统底层优先级高的内核线程也参与了死循环。 可以ping通是因为ping在系统底层处理,没有参与进程调度;而ssh要参与进程调度,但优先级没oom killer高,总是得不到调度。 知道了怎么造成假死,我们就可以针对假死的原因进行预防。建议使用nice将sshd(主要用于pst终端,远程连接到linux服务中)的进程优先级调高,这样当系统内存吃紧时,还是可以勉强登录sshd,进入调试,然后分析故障。
如何分析故障? 从五个方向:现象是什么?什么时候发生?为什么会发生?那个地方发生的问题?耗费多少资源?怎么解决问题? (1)CPU关注的是内核CPU调度器功能和性能。分析工具采用 uptime,vmstat,mpstat,top,pidstat,这五个只能查询到cpu及负载的使用情况;perf可以跟着到进程内部具体函数耗时情况,并且可以指定内核函数进行统计,指哪打哪。 top //查看系统cpu使用情况  mpstat -P ALL 1 //查看所有cpu核信息  vmstat 1 //查看cpu使用情况以及平均负载  pidstat -u 1 -p pid //进程cpu的统计信息  perf top -p pid -e cpu-clock //跟踪进程内部函数级cpu使用情况
(2)内存是为提高效率而生,内存出现问题可能不只是影响性能,而是影响服务或者引发其他问题。OOM问题就在其中。分析工具:free,vmstat,top,pidstat,pmap只能统计内存信息以及进程的内存使用情况;valgrind可分析内存泄漏问题;dtrace动态跟踪。 free -m //查看系统内存使用情况  vmstat 1 //虚拟内存统计信息  top //查看系统内存情况
pidstat -p pid -r 1 //1s采集周期,获取内存的统计信息  pmap -d pid //查看进程的内存映像信息  valgrind --tool=memcheck --leak-check=full --log-file=./log.txt ./程序名 //检测程序内存问题 (3)磁盘IO是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,磁盘离CPU最远且CPU访问磁盘要涉及机械操作。 Iotop //查看系统io信息
iostat -d -x -k 1 10 //统计io详细信息  pidstat -d 1 -p pid //查看进程级io的信息  //查看系统IO的请求,比如可以在发现系统IO异常时,可以使用该命令进行调查,就能指定到底是什么原因导致的IO异常 perf record -e block:block_rq_issue -ag ^C perf report (4)网络监测是所有linux子系统里面最复杂的,影响因素过多。 netstat -s //显示网络统计信息  netstat -nu //显示当前UDP连接状况 netstat -apu //显示UDP端口号的使用情况 netstat -a | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ //统计机器中网络连接各个状态个数 ss -t -a //显示TCP连接  ss -s //显示sockets摘要信息 ss -u -a //显示所有udp sockets sar -n TCP,ETCP 1 //tcp,etcp状态 
sar -n DEV 1 //查看网络IO tcpdump -i eth1 host 192.168.1.1 and port 80 //抓包以包为单位进行输出 tcpflow -cp host 192.168.1.1 //抓包以流为单位显示数据内容 (5)系统负载Load就是对计算机干活多少的度量,简单说就是进程队列的长度。Load average是一段时间内平均load。 //查看负载情况 uptime top vmstat  strace -c -p pid //统计系统调用耗时情况 strace -T -e epoll_wait -p pid //跟踪指定的系统操作例如epoll_wait dmesg //查看内核日志信息 
4.后台进程管理,安装screen和nohup命令,并使用,截图,并给出心得体会
早期的后台进程管理  运行程序时,让其在后台执行  ^Z是ctrl+z。将前台的程序挂起(暂停)到后台   查看后台作业  让作业 2 在后台运行,将作业 1 调回到前台  kill 1,终止 PID 为 1 的进程  这是一个循环,两秒输出一次时间,进程在后台运行,但输出依然在当前终端  使用screen和nohup后的后台进程管理  安装screen命令  安装redis命令  启动redis,关闭终端后redis进程就没有了  下载mysql安装包  使用ctrl + a + d组合键可以放置后台  查看screen列表  打开screen终端
5.系统平均负载,使用stress、mpstat、pidstat命令,找出平均负载升高的根源。
 通过uptime命令,来了解系统的负载情况。 我们已经比较熟悉前面几个例子,他们分别是当前时间,系统运行时间,以及正在登陆用户数#后面三个数依次是:过去1分钟,5分钟,15分钟的平均负载(Load Average)。 接下来通过三个示例分别来看这三种情况,并用:stress、mpstat、pidstat等工具找出平均负载升高的根源。 stress是Linux系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。 mpstat是多核CPU性能分析工具,用来实时检查每个CPU的性能指标,以及所有CPU的平均指标。 pidstat是一个常用的进程性能分析工具,用来实时查看进程的CPU,内存,IO,以及上下文切换等性能指标。  安装stress命令 案例一:cpu密集型  第一个终端执行  第二个终端查看  高亮显示变化区域  从终端2可以看到,1分钟平均负载会慢慢增加到2.00,而从终端三中还可以看到,正好有一个CPU的使用率为100%,但他的IOwait只有0,这说明平均负载的升高正式由于CPU使用率为100%,那么到底哪个进程导致CPU使用率为100%呢?可以使用pidstat来查询。 案例二:I/O密集型  使用stress命令,但是这次模拟IO的压力  在第二个终端运行uptime查看平均负载的变化情况  在第三个终端运行mpstat查看CPU使用率的变化情况  然后再次查看结果,明显显示的数据多了 案例三:大量进程的场景 当系统运行进程超出CPU运行能力时,就会出现等待CPU的进程。  首先,我们还是使用stress命令,模拟的是多个进程  由于系统只有一个CPU,明显比4个进程要少的多。因此,系统的CPU处于严重过载状态  在运行pidstat命令来查看一下进程的情况
心得体会: 1.学习到了更多的linux指令尤其是关于进程的指令,如screen、nohupstress、mpstat、pidstat。 2.平均负载高有可能是CPU密集型进程导致的。 3.当发现负载高时,可以使用mpstat、pidstat等工具,快速定位到,负载高的原因,从而做出处理。
6. 参考P81页的代码,编写程序
未运行a.out之前查看进程  编译之后的.out文件,运行之后显示所有进程,与前面查出来的进程一样  显示没有控制终端的进程   杀掉5319进程,然后再运行.out文件   top命令查看linux的系统状态   stress命令对cpu进行压力测试之后用pidstat和mpstat查看cpu使用率   调试过程 首先编写test.c文件,gcc编译后生成a.out文件,运行a.out文件,输入a运行ps -a指令,查看所有进程,输入x运行ps -x指令查看没有控制终端的进程,输入t运行top指令,查看linux的系统状态,输入s运行stress -c 1 -t 100对cpu进行压力测试,最后用mpstat、pidstat指令查看cpu使用率。 心得体会 1.学习到了更多的linux指令,尤其是关于进程的指令,如ps,top等 2.当创建子进程之后,子进程处理任务同时,父进程是可以继续接受命令的。 3.在使用kill命令的时候,好几次杀掉了系统的进程,导致虚拟机直接崩掉,这让我更加体会到了kill需谨慎使用,且要多多注意进程是否为系统进程。
|