linux管理进程的数据结构,Linux 进程运行的各项指标的监测和一些管理命令的应用...

进程(Process)是程序运行的一个实例,是定义在多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元。系统分配资源的基本单位。

CPU 数量有限,而系统上要运行的任务(进程)很多,在任意时刻CPU只能运行一个进程。采用分时机制,把CPU的运算时间进行分片,让每个进程都获得CPU的时间片(time slice).由于进程运行的时间片很短,所以从表面看来所有进程是在同时运行着。意思是说,进程A使用完它的CPU时间后,内核根据调度算法把进程B调度到CPU上来运行,等到进程B使用完它的CPU时间后,内核根据调度策略又把另外一个进程调度到CPU上运行,就此类推。而该过程就叫做:进程的上下文切换(context switches)

Linux 内核用数据结构 task_struct(任务数据结构) 表示一个进程,taks_struct 是在创建进程时候,内核为了追踪一个进程而使用的数据结构。

操作系统使用 task_struct 保持跟踪进程运行所需的所有状态信息。这种状态,也就是”上下文“。它包括许多信息,例如 PC(指令计数器) 和寄存器文件的当前值,以及主存的内容。在任何一个时刻,单处理器系统都只能执行一个进程的代码。当操作系统决定要把控制权从当前进程转移到某一个新进程时,就会进行“上下文切换”,即保存当前进程的上下文、恢复用户进程的上下文,然后将控制权传递到新进程。新进程就会从上次停止的地方开始执行。

监测指定的进程的运行状况:页请求错误、虚拟内存的大小、常驻内存的大小等:[root@node2 ~]# watch -n 1 'ps axo pid,comm,min_flt,maj_flt,trs,drs,vsize,size,rss | grep httpd'

Every 1.0s: ps axo pid,comm,min_flt,maj_flt,trs,drs,vsize,size,rss | grep httpd                       Sat Jun 14 03:14:09 2014

3521 httpd             1169      2  387 35384  35772 13288 10248

3524 httpd             3194     55  387 37672  38060 15576 12300

3525 httpd             2179      6  387 37136  37524 15040 11524

3527 httpd              356      2  387 35384  35772 13288  9160

3528 httpd             1618      5  387 37908  38296 15812 12036

4539 httpd             1540      5  387 37656  38044 15560 11816

4549 httpd             4552     87  387 36860  37248 14764 11376

4550 httpd             2311     10  387 38928  39316 16832 13352

4551 httpd             3790     12  387 37656  38044 15560 12220

4552 httpd              363      3  387 35384  35772 13288  9184

4629 httpd              355      1  387 35384  35772 13288  9156

说明:

min_flt(minor fault)         表示程序的页请求错误次数.内存中已经缓存有进程所需要的页面数据

了。只要把该页面数据与进程的虚拟地址空间建立映射关系就可以了。

maj_flt(major fault)         表示程序的页请求错误次数。内存中没有缓存有进程所需要的页面数

据。内核必需要通知CPU从磁盘中把页面数据加载到内存中来。

TRS            表示程序所拥有的可执行虚拟内存的大小(KB);

DRS           表示程序数据段和用户态的栈的大小(KB);

vsize            表示程序使用的虚拟内存大小(KB) total vm size in KB.

size            表示程序使用的内存大小(KB) memory size in kilobytes.

rss             表示程序常驻内存的大小。常驻内存指的是,该进程占据的页面是不可

以从物理内存交换出去的。

TRS + DRS = vsize

通过 /proc接口 查看进程(应用程序)所能使用的系统资源:[root@node2 ~]# cat /proc/3521/limits

Limit                     Soft Limit           Hard Limit           Units

Max cpu time              unlimited            unlimited            seconds

Max file size             unlimited            unlimited            bytes

Max data size             unlimited            unlimited            bytes

Max stack size            10485760             unlimited            bytes

Max core file size        0                    unlimited            bytes

Max resident set          unlimited            unlimited            bytes

Max processes             4096                 4096                 processes

Max open files            1024                 1024                 files

Max locked memory         32768                32768                bytes

Max address space         unlimited            unlimited            bytes

Max file locks            unlimited            unlimited            locks

Max pending signals       4096                 4096                 signals

Max msgqueue size         819200               819200               bytes

Max nice priority         0                    0

Max realtime priority     0                    0

说明:

Max cpu time           能使用的CPU时间

Max stack size         能使用的最大栈(stack)大小(bytes)

Max processes        父进程最多同时能 fork 多少个进程。

Max open files         最多同时可以打开多少个文件。像 Nginx 服务器,使用 一个进程响应N个请

求,那么只能并发1024个用户请求。

一个套接字文件表示一个用户请求。所以,想要 Nginx 并发更大的请求数,首先要修改它能同时打开的文件数量。

动态监控系统中占用物理内存最大的任务(进程)。方法:使用命令【top】,再与top进程交互,按"M"键,命令【top】显示的结果就按照占用物理内存大小进行

排序。[root@node2 ~]# top

top - 04:08:05 up  2:06,  3 users,  load average: 0.02, 0.03, 0.00

Tasks: 106 total,   1 running, 105 sleeping,   0 stopped,   0 zombie

Cpu(s):  0.3%us,  3.0%sy,  0.0%ni, 96.0%id,  0.3%wa,  0.0%hi,  0.3%si,  0.0%st

Mem:    255412k total,   233208k used,    22204k free,    31548k buffers

Swap:   128512k total,        0k used,   128512k free,    87048k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

3141 mysql     15   0  304m  35m 5280 S  0.0 14.3   0:00.77 mysqld

4550 daemon    15   0 39316  13m 2856 S  0.0  5.2   0:00.13 httpd

3524 daemon    15   0 38060  12m 2884 S  0.0  4.8   0:00.29 httpd

4551 daemon    15   0 38044  11m 2856 S  0.0  4.8   0:00.27 httpd

3528 daemon    15   0 38296  11m 2860 S  0.0  4.7   0:00.09 httpd

4539 daemon    15   0 38044  11m 2852 S  0.0  4.6   0:00.07 httpd

3525 daemon    15   0 37524  11m 2856 S  0.0  4.5   0:00.16 httpd

4549 daemon    15   0 37248  11m 2880 S  0.0  4.5   0:00.36 httpd

3394 root      34  19 25448  10m 2104 S  0.0  4.0   0:00.03 yum-updatesd

3521 root      18   0 35772  10m 3496 S  0.0  4.0   0:00.10 httpd

4552 daemon    15   0 35772 9184 2384 S  0.0  3.6   0:00.05 httpd

3527 daemon    15   0 35772 9160 2364 S  0.0  3.6   0:00.01 httpd

4629 daemon    15   0 35772 9156 2364 S  0.0  3.6   0:00.00 httpd

[root@node2 ~]# top   使用"A"键与【top】交互

1:Def - 04:38:57 up  2:37,  3 users,  load average: 0.11, 0.08, 0.02

Tasks: 107 total,   4 running, 102 sleeping,   0 stopped,   1 zombie

Cpu(s):  0.7%us,  2.0%sy,  0.0%ni, 97.0%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st

Mem:    255412k total,   236148k used,    19264k free,    34488k buffers

Swap:   128512k total,        0k used,   128512k free,    87056k cached

1  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

3141 mysql     15   0  304m  35m 5280 S  0.0 14.3   0:00.87 mysqld

4550 daemon    15   0 39316  13m 2856 S  0.0  5.2   0:00.13 httpd

3524 daemon    15   0 38060  12m 2884 S  0.0  4.8   0:00.29 httpd

4551 daemon    15   0 38044  11m 2856 S  0.0  4.8   0:00.27 httpd

3528 daemon    15   0 38296  11m 2860 S  0.0  4.7   0:00.09 httpd

2  PID  PPID    TIME+  %CPU %MEM  PR  NI S  VIRT SWAP  RES  UID COMMAND

19730  7719   0:00.00  0.0  0.0  19   0 Z     0    0    0    0 sh 

19121  3654   0:01.11  0.0  0.4  15   0 R  2320 1296 1024    0 top

13403 13401   0:00.16  0.0  0.3  15   0 S  4184 3384  800    0 less

13401 13399   0:00.00  0.0  0.4  20   0 S  4488 3504  984    0 sh

13399  3482   0:00.00  0.0  0.3  18   0 S  3900 3128  772    0 man

3  PID %MEM  VIRT SWAP  RES CODE DATA  SHR nFLT nDRT S  PR  NI %CPU COMMAND

3141 14.3  304m 268m  35m 8688 293m 5280   86    0 S  15   0  0.0 mysqld

4550  5.2 39316  25m  13m  388  16m 2856   10    0 S  15   0  0.0 httpd

3524  4.8 38060  25m  12m  388  15m 2884   55    0 S  15   0  0.0 httpd

4551  4.8 38044  25m  11m  388  15m 2856   12    0 S  15   0  0.0 httpd

3528  4.7 38296  25m  11m  388  15m 2860    5    0 S  15   0  0.0 httpd

4539  4.6 38044  25m  11m  388  15m 2852    5    0 S  15   0  0.0 httpd

说明:

说明:

VIRT            进程使用的虚拟内存的大小。包括代码段(code)、数据段(data)和共享库以及交换到

swap的页面。(KB)

VIRT = SWAP + RES

SWAP          虚拟内存影像的一部分 The swapped out portion of a task's total virtual memory p_w_picpath.

(KB)

RES             进程使用的物理内存的大小,指的是常驻内存的大小。(KB) The non-swapped physical

memory a task has used.

RES = CODE + DATA

CODE           Code size (KB) 进程所常驻物理内存大小中用于执行代码的内存的大小,Text segment.

DATA            Data+Stack size (KB)  数据段Data segment + 栈段 stack segment

SHR              一个进程使用的共享内存大小 Shared Mem size (KB)

nFLT              major fault类型的页请求错误数 Page Fault count. The  number  of  major page faults

that have occurred for a task.

nDRT            进程写到磁盘的脏页数 Dirty Pages count

总结:

如果 Appache 服务器是基于  prefork 模型的话,一个进程就要占据大约 12M 的物理内存空间。还不包括被从物理内存中交换出去的页面。

基于 prefork 模型的 Appache 服务器,是使用一个进程响应一个用户的请求的。假如并发请求数

为1000,那么我们的 httpd 服务器最少要消耗12M * 1000 = 12000M 也就是大约10GB的内存。

使用命令 pmap 查看进程的地址空间分布(也可以使用 cat /proc//maps):[root@node2 ~]# pmap 3910

3910:   nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

002ca000    104K r-x--  /lib/ld-2.5.so

002e4000      4K r-x--  /lib/ld-2.5.so

002e5000      4K rwx--  /lib/ld-2.5.so

002ed000   1276K r-x--  /lib/libc-2.5.so

0042c000      4K --x--  /lib/libc-2.5.so

0042d000      8K r-x--  /lib/libc-2.5.so

0042f000      4K rwx--  /lib/libc-2.5.so

00430000     12K rwx--    [ anon ]

......

08047000    432K r-x--  /usr/sbin/nginx

080b3000     40K rw---  /usr/sbin/nginx

080bd000     40K rw---    [ anon ]

097fe000    132K rw---    [ anon ]

b7fe6000     20K rw---    [ anon ]

b7ff4000      4K rw-s-  /dev/zero (deleted)

bff8f000     84K rw---    [ stack ]

total     5740K

说明:

第一列为内存区域起始地址,第二列为内存区域大小(虚拟内存),第三列为属性,第四列为内存映

射的文件。

一个进程运行的时候,其用到文件的代码段、数据段等都是映射到内存地址区域的。这个功能是

通过系统调用 mmap() 来完成的。

进程占用的虚拟内存为:5740KB.[root@node2 ~]# pmap -x 3910

3910:   nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

Address   Kbytes     RSS   Dirty Mode   Mapping

002ca000     104       0       0 r-x--  ld-2.5.so

002e4000       4       4       4 r-x--  ld-2.5.so

002e5000       4       4       4 rwx--  ld-2.5.so

002ed000    1276      48       0 r-x--  libc-2.5.so

0042c000       4       0       0 --x--  libc-2.5.so

0042d000       8       8       4 r-x--  libc-2.5.so

0042f000       4       4       4 rwx--  libc-2.5.so

00430000      12      12      12 rwx--    [ anon ]

......

08047000     432      68       0 r-x--  nginx

080b3000      40      40      36 rw---  nginx

080bd000      40      12      12 rw---    [ anon ]

097fe000     132     124     124 rw---    [ anon ]

b7fe6000      20      20      20 rw---    [ anon ]

b7ff4000       4       0       0 rw-s-  zero (deleted)

bff8f000      84      12      12 rw---    [ stack ]

-------- ------- ------- ------- -------

total kB    5740       -       -       -

说明:

该进程所占据的虚拟地址空间为: 5740KB;

RSS 表示该进程的常驻内存的大小(KB);

Dirty 表示脏页。

可以看得出,它们的地址是连续的。

使用接口 /proc[root@node2 ~]# cat /proc/3910/maps

002ca000-002e4000 r-xp 00000000 08:02 67212      /lib/ld-2.5.so

002e4000-002e5000 r-xp 00019000 08:02 67212      /lib/ld-2.5.so

002e5000-002e6000 rwxp 0001a000 08:02 67212      /lib/ld-2.5.so

002ed000-0042c000 r-xp 00000000 08:02 67213      /lib/libc-2.5.so

0042c000-0042d000 --xp 0013f000 08:02 67213      /lib/libc-2.5.so

0042d000-0042f000 r-xp 0013f000 08:02 67213      /lib/libc-2.5.so

0042f000-00430000 rwxp 00141000 08:02 67213      /lib/libc-2.5.so

00430000-00433000 rwxp 00430000 00:00 0

......

08047000-080b3000 r-xp 00000000 08:02 1525801    /usr/sbin/nginx

080b3000-080bd000 rw-p 0006b000 08:02 1525801    /usr/sbin/nginx

080bd000-080c7000 rw-p 080bd000 00:00 0

097fe000-0981f000 rw-p 097fe000 00:00 0          [heap]

b7fe6000-b7feb000 rw-p b7fe6000 00:00 0

b7ff4000-b7ff5000 rw-s 00000000 00:09 17042      /dev/zero (deleted)

bff8f000-bffa4000 rw-p bffea000 00:00 0          [stack]

通过 /proc 接口查看进程的状态[root@node2 ~]# cat /proc/3521/status

。。。

VmPeak:    35772 kB

VmSize:    35772 kB

VmLck:         0 kB

VmHWM:     10248 kB

VmRSS:     10248 kB

VmData:    13204 kB

VmStk:        84 kB

VmExe:       388 kB

VmLib:     21016 kB

VmPTE:        68 kB

StaBrk: 085f7000 kB

Brk:    08846000 kB

StaStk: bfd6bc20 kB

。。。

Cpus_allowed:   00000001

Mems_allowed:   1

查看一个可执行二进制程序所依赖的库文件。[root@node2 ~]# ldd /usr/local/apache2/bin/httpd

linux-gate.so.1 =>  (0x00f40000)

libm.so.6 => /lib/libm.so.6 (0x00455000)

libaprutil-1.so.0 => /usr/lib/libaprutil-1.so.0 (0x007b4000)

libcrypt.so.1 => /lib/libcrypt.so.1 (0x00c79000)

libldap-2.3.so.0 => /usr/lib/libldap-2.3.so.0 (0x001f2000)

liblber-2.3.so.0 => /usr/lib/liblber-2.3.so.0 (0x0025a000)

......

追踪一个已经启动的进程[root@node2 ~]# strace -p 3521

追踪启动一个进程启动的时间、发生的系统调用、是否有错误等等[root@node2 ~]# strace -c /usr/local/apache2/bin/httpd

% time     seconds  usecs/call     calls    errors syscall

------ ----------- ----------- --------- --------- ----------------

59.55    0.002931         183        16           mprotect

12.21    0.000601           9        65           munmap

11.40    0.000561         561         1           clone

11.19    0.000551           3       178           read

1.36    0.000067           0       292           mmap2

1.20    0.000059           0       180        27 open

0.95    0.000047           0       151           fstat64

0.93    0.000046           0       114           time

0.45    0.000022           4         6           write

0.41    0.000020           0       164           close

0.00    0.000000           0         1           execve

0.00    0.000000           0         1           chdir

0.00    0.000000           0         1           lseek

0.00    0.000000           0         2         1 access

。。。

0.00    0.000000           0        12           socket

0.00    0.000000           0         3           bind

0.00    0.000000           0         8         6 connect

。。。

0.00    0.000000           0         1           semget

0.00    0.000000           0         2           semctl

------ ----------- ----------- --------- --------- ----------------

100.00    0.004922                  1293        50 total

查看一个进程打开的文件[root@node2 ~]# lsof -p 3910

COMMAND  PID USER   FD   TYPE     DEVICE     SIZE    NODE NAME

nginx   3910 root  cwd    DIR        8,2     4096       2 /

nginx   3910 root  rtd    DIR        8,2     4096       2 /

nginx   3910 root  txt    REG        8,2  3923026 1525801 /usr/sbin/nginx

nginx   3910 root  mem    REG        8,2   125736   67212 /lib/ld-2.5.so

nginx   3910 root  mem    REG        8,2  1611564   67213 /lib/libc-2.5.so

nginx   3910 root  mem    REG        8,2    16428   67217 /lib/libdl-2.5.so

......

通过 /proc 接口查看进程打开的文件[root@node2 ~]# ll /proc/3910/fd/

total 0

lrwx------ 1 root root 64 Jun 14 10:09 0 -> /dev/null

lrwx------ 1 root root 64 Jun 14 10:09 1 -> /dev/null

l-wx------ 1 root root 64 Jun 14 10:09 2 -> /var/log/nginx_error.log

lrwx------ 1 root root 64 Jun 14 10:09 3 -> socket:[17044]

l-wx------ 1 root root 64 Jun 14 10:09 4 -> /var/log/nginx_error.log

l-wx------ 1 root root 64 Jun 14 10:09 5 -> /var/log/nginx/access.log

lrwx------ 1 root root 64 Jun 14 10:09 6 -> socket:[17041]

lrwx------ 1 root root 64 Jun 14 10:09 7 -> socket:[17045]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值