IT技术博客大学习 共学习 共进步

Linux系统管理技术手册第四章习题实践

Linux|系统管理|WEB开发 2009-11-27 17:43:15 浏览 3,002 次

E4.1 解释一个文件的UID和一个正在运行的进程的真实UID以及有效UID之间的关系。除了文件的访问控制外,进程的有效UID有什么用途?

A: 大部分情况下,文件的UID和运行的真实UID以及有效UID是一致的。但是对于setuid程序而言。进程的真实UID和有效UID就有区别了。比如/usr/bin/passwd程序。它的属主是root(UID=0),如果一个用户(UID=1000)运行它,那么真实UID为1000,但是有效UID则为0。有效UID除了文件访问控制外,还能提升当前运行程序的“临时特权”。

E4.2 假定您所负责的站点中,有一个用户已经启动恶劣一个长期运行的进程,它消耗了机器的很大一部分资源。

  1. 您如何意识到某一个进程正在消耗资源?
  2. 假定异常的进程可能是合法的,不应该杀死它。给出您要把它“冻结”起来(在您调查期间,暂时停止它的运行)应该使用的命令?
  3. 随后,您发现这个进程属于 您的老板,必须继续运行下去。给出您要继续执行这个任务应该使用的命令。
  4. 另一种可能是假定需要杀死这个进程。您会发送什么信号?为什么?如果您要保证这个进程确实已经被杀死了,该怎么做?

A: 查看uptime,发现复杂高于平常,然后查看top结果,能找到异常的进程。
对于不能马上杀死的异常进程,我们可以采取暂定的方式来临时冻结进程,利用
kill -STOP pid
指令来冻结进程。
调查清楚后,如果想继续运行该进程,则使用
kill -CONT pid
来恢复运行。
如果想杀死,可以先尝试
kill -TERM pid
的方式来温柔的杀死,如果不凑效,则利用野蛮杀死法
kill -9 pid
然后通过ps指令查看该进程是否还在。如果不在,则表示已经杀死了。

E4.3 找出一个能导致内存泄漏的进程(如果手头没有,就自己写一个)。用ps或者top来监视程序程序运行时内存的使用情况。

A: 这一类的问题,在实际的工作中遇到过一些,绝大部分都是java程序,因为内存没有回收,导致内存的使用不断的增加,用完内存的一定比列后(由swappiness值决定),继续使用swap值,最后导致系统出现OOM(Out-Of-Memory)。

E4.4 编写一个处理ps输出的Perl脚本,确定在系统上正在运行的进程总的VSZ和RSS值。这些数字和系统物理内存和交换空间的实际量有什么关系?

A:仅仅是获得VSZ和RSS值的总和,没有必要用到perl这种方式吧(其实是我对perl一窍不通),直接awk也能处理。下面是一行指令:
ps aux |awk ‘BEGIN{vsz = 0;rss = 0;print “vsz \t rss”} {vsz+=$5;rss+=$6} END{print vsz,rss}’

下面是我机器上的输出结果:
$ ps aux |awk ‘BEGIN{vsz = 0;rss = 0;print “vsz \t rss”}\
{vsz+=$5;rss+=$6} END{print vsz,rss}’
vsz      rss
3310800 830324
要注意一下单位。vsz是进程的虚拟大小,KiB单位。而rss则是驻留大小,KiB单位。因此,我们转换一下。
$ ps aux |awk ‘BEGIN{vsz = 0;rss = 0;print “vsz(GiB) \t rss(MiB)”} \
{vsz+=$5;rss+=$6} END{print vsz / 1024 / 1024 ,rss  / 1024 }’
vsz(GiB)   rss(MiB)
3.15749 811.973

我机器的内存是:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          2768       1593       1175          0        168        662
-/+ buffers/cache:        763       2005
Swap:         3169          0       3169

VSZ 是进程使用的虚拟内存大小. (包括内存和SWAP空间上)

RSS 指的是驻留在内存中的大小。
大部分程序都使用共享库,注意VSZ和RSS会包含共享库的部分。如果多个进程都使用相同的共享库,共享部分的内存会分别计入不同的进程内存。所以所有进程RSS部分累加可能会超出物理内存总数。
所以,我认为RSS和VSZ于物理内存以及交换空间没有什么关系,因为其中共享库的内存大小重复计算了。在一些资源紧张的机器上,这两个值可能都超过了内存的总和,比如:

$  ps aux |awk 'BEGIN{vsz = 0;rss = 0;print "vsz(GiB) \t rss(MiB)"}  \
  {vsz+=$5;rss+=$6} END{print vsz / 1024 / 1024 ,rss  / 1024  }'; free -m
vsz(GiB) 	 rss(MiB)
62.7103 18703.7
             total       used       free     shared    buffers     cached
Mem:          2027       1967         59          0         20       1750
-/+ buffers/cache:        195       1831
Swap:         4094        121       3972

这里,vsz的总和达到了62GiB,远超过6G的内存总和。而rss的总和也达到了1.8G。
不过从我观察到的数据来说,大部分情况下,rss的总和等于buffers + cached值,但是否正确,还需要实际的数据和理论双层检验。

建议继续学习

  1. Linux系统管理手册习题实践 (阅读 3,522)
  2. linux系统管理技术手册第十二章系统实践 (阅读 3,202)
  3. Linux系统管理技术手册第五章习题实践 (阅读 3,182)
  4. Linux系统管理技术手册第10章系统实践 (阅读 3,141)
  5. Linux系统管理技术手册第三章习题实践 (阅读 3,063)
  6. Linux系统管理技术手册第十三章系统实践 (阅读 2,822)
  7. Linux系统管理技术手册第8章习题实践 (阅读 2,703)
  8. Linux系统管理技术手册第六章习题实践 (阅读 2,544)
  9. Linux系统管理手册第二章习题实践 (阅读 2,404)
  10. Linux系统管理技术手册第七章习题实践 (阅读 2,382)