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]
linux管理进程的数据结构,Linux 进程运行的各项指标的监测和一些管理命令的应用...相关推荐
- 操作系统学习笔记7——进程管理中的数据结构:进程控制块
进程控制块(PCB)--最重要的记录型数据结构 PCB的作用 1.作为独立运行的基本单位的标志: 系统创建一个新进程时,就为它建立一个PCB,进程结束时回收PCB,进程也随之消亡,系统通过感应PCB来 ...
- 操作系统4小时速成:进程管理占考试40%,进程状态,组织,通信,线程拥有调度,进程拥有资源,进程和线程的区别
操作系统4小时速成:进程管理占考试40%,进程状态,组织,通信,线程拥有调度,进程拥有资源,进程和线程的区别 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去 ...
- 《Linux C编程从入门到精通》一第1章 Linux基础1.1 Linux的起源、发展和分类
本节书摘来自异步社区<Linux C编程从入门到精通>一书中的第1章,第1.1节,作者 宋磊 , 程钢,更多章节内容可以访问云栖社区"异步社区"公众号查看 第1章 Li ...
- Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】...
前言 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) idle进程由系统自动创建, 运行在内核态 idle进程其pi ...
- Linux第六周学习总结——进程额管理和进程的创建
Linux第六周学习总结--进程额管理和进程的创建 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/cour ...
- (王道408考研操作系统)第二章进程管理-第一节4:进程通信(配合Linux)
文章目录 一:什么是进程通信 二:如何实现进程间通信及其分类 三:通信方式1-共享存储(共享内存) (1)课本基础内容 (2)补充-Linux中的进程通信 四:通信方式2-管道 (1)管道是什么 (2 ...
- (王道408考研操作系统)第二章进程管理-第一节3:进程控制(配合Linux讲解)
文章目录 一:如何实现进程控制 二:进程控制原语 (1)进程创建 A:概述 B:补充-Linux中的创建进程操作 ①:fork() ②:fork()相关问题 (2)进程终止 A:概述 B:补充-僵尸进 ...
- linux 进程数据结构,Linux进程数据结构详解
1.Linux的进程简介: 支持多线程的操作系统中,进程是资源分配的最小单位,线程是调度的基本单位.Linux是现代的32位或64位的支持多线程的操作系统,不过Linux是一种以轻量级进程作为线程,多 ...
- linux 进程间切换,linux 进程管理 进程切换
2.Arm体系架构中进程切换过程 在之后的文章里,可能会有很大部分的篇幅是介绍内核如何调度和管理进程.学习了解这部分内容,很多时候是和task struct,run queue,schedule en ...
- Linux内核源码分析《进程管理》
Linux内核源码分析<进程管理> 前言 1. Linux 内核源码分析架构 2. 进程原理分析 2.1 进程基础知识 2.2 Linux进程四要素 2.3 进程描述符 task_stru ...
最新文章
- [20150309]使用冷备份做恢复的问题.txt
- 单独组件_苹果已停止对macOS Big Sur 11.0.1版本macOS系统组件的单独更新
- 利用vue进行页面滚动监听,上拉刷新
- 交换机和路由器上流量限制
- 参数(条件表)灵活配置GS01/GS02/GS03
- 共享共治 - 全球化背景下的DNS基础设施服务
- 数据结构与算法-ADT-Array
- 主机安装php网站,php支持虚拟主机(php网站空间)
- C语言---关于关键字const与static的简单理解
- jdk1.5新特性5之枚举之模拟枚举类型
- php判断ajax传入,利用PHP判断是否为AJAX请求代码
- 模拟image的ajaxPrefilter与ajaxTransport处理
- android opencl sdk,在新的Android Studio中使用OpenCL
- VMware安装win7系统
- python分词工具
- js基础知识总结大全
- 微信公众号接入自己的客服系统,自定义客服系统
- 如何删除计算机guest用户,win7如何删掉Guest账户?win7删除Guest账户方法
- JVM面试专题(上)
- Android Studio 内部字体大小修改
热门文章
- ios怎么引入masonry_IOS之Masonry小结
- 为什么java导入有x_ImportError:无法导入名称X
- android强制权限,Android6.0动态权限,强制申请权限方法
- php env 函数不存在,php-Laravel 5.2无法读取env fi
- python取列表前几个元素_从Python列表中获取前n个唯一元素
- 薄壁轴承摩擦力矩_超薄壁球轴承的应用分析
- Springboot基于thymeleaf的一个简单的学生管理系统
- 小菜找实习——阿里3月27日场笔试第一题
- 多时相地图瓦片简单设想
- logback的日志文件中出现大量的ESC符号