============================================================================================================================================== 一、相关概念 1、系统调用 System Call 通常情况下,用户空间的程序是不能直接访问内核空间调用系统功能的,运行在用户空间的应用程序需要执行更高权限的内核功能时, 就会向内核发出系统调用请求完成内核功能。系统调用是用户空间和内核之间的接口。典型的需要系统调用的操作有磁盘I/O、进程间 通信。系统调用和库函数类似,库函数运行再用户空间,由用户提供 ; 系统调用在内核,由内核提供。 系统调用实现方式: 应用程序调用库函数(API) API 将系统调用号存入 EAX,然后通过中断调用使系统进入内核态 内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用) 系统调用完成相应功能,将返回值存入 EAX,返回到中断处理函数 中断处理函数返回到 API 中 API 将 EAX 返回给应用程序 2、内核的功能 进程调度管理 虚拟文件系统管理 网络接口|网络管理 进程管理 内存管理 驱动程序 安全功能 3、进程/线程 process/thread 1、进程和线程有很多相似的地方,所以习惯上称线程为轻量级的进程(Light Weight Process LWP)。 2、可以理解为进程是只有一个线程的进程。 调度: 传统的方式中进程是CPU调度的基本单位,引入线程概念后,CPU调度的基本单位不在是进程,而是 线程。进程只是分配资源的基本单位。在同一个进程中的线程切换,不需要系统调用。提高了系统性能。 并发性: 引入线程的机制可以在一个进程内有更多的并发。 系统开销: 线程不在拥有运行时所需要的所有资源,而是共享属主进程的资源。线程共享进程的内存空间。 拥有资源: 线程切换的系统开销远小于进程的切换。 4、进程优先级 说明:0-139,40种优先级 0-99 内核控制,系统优先级 100-139 用户可控制的优先级,数字越小,优先级越高 |_____________________________|____________120____________| 0 实时优先级 100 优先级 139 -20____________0_____________19 对应nice值 |_______________________系统优先级________________________| TOP PRT__________________________PRT____________20____________39 0 5、nice值 每一个进程都有一个nice值:-20~19,分别对应优先级100-139 1、nice值0对应优先级120 2、默认每一个进程的nice值都为0 3、普通用户只能调大进程的nice值 4、nice值越小,表示优先级越高,否则越低 **********nice值也叫静态优先级************* 6、进程间通信 进程间通信(IPC,Inter-Process Communication),指两个进程或线程之间传送数据或信号的技术。 同一个主机进程间通信的方式有: 消息传递 signal 共享内存 shared memory 不同主机进程间通信: RPC remote procedure call 远程过程调用 socket IP 端口 7、进程状态 1.运行态 running 2.就绪态 ready 3.睡眠态 可中断 不可中断 4.停止态 Stopped,暂停于内存,但不会被调度,除非手动启动 5.僵死态 zombie,结束进程,父进程结束前,子进程不关闭 D 不可终端的睡眠 R 运行或就绪 S 可终端的睡眠 T 停止 Z 僵死 > 高优先级的进程 N 低优先级进程 + 前台进程组中的进程 l 多线程进程 s 会话进程的首进程 8、task struct 任务列表 Linux内核存储进程信息的数据结构格式 9、LRU Least Recently User 近期最少使用算法。释放内存物理地址空间和线性地址空间 10、MMU :Memory Management Unit 负责转换线性和物理地 11、TLB:Translation Lookaside Buffer 翻译缓冲器, 用于保存虚拟地址和物理地址映射关系的缓存 12、进程类型 守护进程 和终端无关,在用户没登录就已经启动的进程 前台进程 和终端相关(由bash进程启动的子进程) CPU-Bound CPU密集型 进程的运行需要大量的CPU计算 IO-Bound I/O密集型 进程的运行需要大量的I/O操作 13、操作系统只能识别二进制程序,程序保存在磁盘上,当用户通过操作系统调用这个程序时,这个程序被加载到内存 运行,进而成为一个进程,进程通常都有属组属主的属性及运行的程序都会被分配到一个唯一的号码PID。 ============================================================================================================================================== ============================================================================================================================================== 二、进程管理工具 1、管理工具 [pstree] [ps] pidof pgrep [top] [htop] [glances] [pmap] [vmstat] [dstat] [kill pkill] job bg fg nohub ************************************************************************************************************* 2、pstree 显示进程树 格式: pstree [options] [PID|USERNAME] 选项: -a 显示启动进程的完整参数 -c 不压缩相同的子进程 -h 高亮显示当前进程 -n 通过PID排序 -p 显示PID ************************************************************************************************************* 3、ps 进程状态查看工具,process state (BSD风格选项) a # 显示和终端有关的进程 x # 显示和终端无关的进程 u # 显示进程由那个用户启动 f # 以树状结构显示父子进程关系 o # 显示指定的字段,不能和u选项一起使用,示例:ps axo pid,user,ppid k # 指定字段排序,示例:ps axo %mem,%cpu k %mem -C # 指定 ps -C vi o %CPU,%MEM,COMMAND,可以指定多个ps -C vi -C test.sh o %cpu,%mem,command 注:***字段要小写*** 组合: ps aux 字段含义: USER 进程属主 PID 进程PID TTY 通过那个终端启动的进程 STAT 状态标识 D:不可中断的睡眠 R:运行或就绪 S:可中断的睡眠 T:停止 Z:僵死 >:高优先级的进程 <: 高优先级进程 N:低优先级进程 +:前台进程组中的进程 l:多线程进程 s:会话进程的首进程,子进程的发起者 L:内存分页并带锁 %CPU 运行占用CPU时间的百分比 %MEM 占用内存总空间的百分比 VSZ Virtual memory size 虚拟内存集(线性地址空间中占的真正大小) RSS ReSident Size 常驻内存集(不能被交换,必须在内存中的集) ****真正分配的内存**** START 启动时间 TIME 运行占用CPU的累积时间 COMMAND 加中括号的表示内核的线程 PRI: priority,执行优先顺序,这个值是由系统动态调整的,用户无法修改。PRI(new) = PRI(old) + nice ,nice值可以影响到 PRI值,PRT越小,优先级越高。 NI: nice值,数值越小,优先级越高,数值越大,优先级越低 PSR: 正在运行在那颗CPU,CPU编号 RTPRIO 实时优先级 (UNIX风格选项) -e # 显示所有进程 -l # 长格式 -F/f # 显示更多的信息 -o # 指定显示的字段 -H # 显示进程之间的父子关系 组合: -ef -eFH ************************************************************************************************************* 4、pgrep (pkill用法和pgrep相同) 格式: pgrep [options] 选项: -U UID # real user,实际用户。可以用普通用户执行具有特殊权限的程序passwd -u UID # 有效用户 -t TERMINAL # 指定终端 示例: pgrep -lt pts/2 -l # 显示进程名 -a # 显示完整格式的进程名 -P PID # 显示指定进程的子进程进程列表 示例:pgrep -aP 6377 示例: pgrep -u apache -l -a ************************************************************************************************************* 5、pidof ***注:可以在脚本判断某个进程是否运行*** 获取指定[进程名]的PID 示例: pidof sshd ************************************************************************************************************* 6、top 交互命令 M # 按占用内存大小排序 P # 以占用CPU的百分比 T # 占用CPU累积时间排序 l # 首部信息是否显示 uptime信息显示与否 t # 任务数量信息显示与否及显示格式 m # 内存使用信息显示与否及显示格式 1 # 展开显示CPU核心信息(数字1) s # 修改刷新时间间隔,默认是3秒刷新周期 k # 杀死某个进程。 k PID c W # 将状态信息保存到文件 Z # 进入修改颜色的界面 E/e # 变换内存显示单位 W # 输出top工具的配置文件到/root/.toprc 选项: -d # 指定刷新时间,默认为2秒 -b # 表示一次输出多少屏 -n # 指定显示多少屏后退出,默认不退出 字段: us 用户空间程序使用CPU百分比 sy 内核空间程序所占百分比 ni 调整nice值占的CPU百分比 id 空闲CPU百分比 wa 等待I/O操作完成的时间 hi 处理硬终端所消耗CPU的百分比 si 处理软终端所消耗CPU的百分比 st 被虚拟化技术所占用的CPU百分比 load aberage 平均负载,平均队列长度:分别为过去的1分钟,5分钟,10分钟 PR 优先级 NI 优先级,nice值 VIRT 虚拟内存集,进程使用的虚拟内存总量,单位为kb RES 常驻内存集(真实内存分配),单位为kb SHR 共享内存,单位为kb S 进程当前状态 D= 不可中断的睡眠状态 R= 运行 S= 睡眠 T= 跟踪 / 停止 Z= 僵尸进程 TIME+ 累积运行时长 ************************************************************************************************************* 7、htop 快捷键 s 跟踪选定进程的系统调用 l 列出选定进程打开的文件列表 [ 将选定的进程绑定到指定的CPU核心 e 显示选定进程的环境变量 c 标记进程高亮显示 P 按占用CPU百分比排序 M 按占用内存百分比排序 T 按消耗CPU时间的百分比 ************************************************************************************************************* 8、vmstat 显示虚拟内存的信息 格式: vmstat [options] [delay [count]] 选项: -s # 显示内存使用情况 vmstat N M N # N秒刷新一次 M # 显示M次 -a # 使用inact/active代替buff/cache -f # 从主机开机到当前时间,总共fork的进程数 显示字段含义: procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 743232 1312 170396 0 0 29 1 46 56 0 0 99 0 0 r 运行进程 b 阻塞进程,不可被唤醒的进程 in 和中断相关 cs 上下文切换 —————————————————————————————————————————————————————————————————————————————————————————————————— Procs r: The number of runnable processes (running or waiting for run time). 等待运行的进程的个数(队列长度) b: The number of processes in uninterruptible sleep. 处理不可中断睡眠态的进程个数(被阻塞的队列长度) Memory swpd: the amount of virtual memory used. free: the amount of idle memory. buff: the amount of memory used as buffers. cache: the amount of memory used as cache. inact: the amount of inactive memory. (-a option) 加-a选项会显示的字段 active: the amount of active memory. (-a option) 加-a选项会显示的字段 Swap (内存为参照) si: Amount of memory swapped in from disk (/s). 从磁盘swap到内存的进入速率 kb/s so: Amount of memory swapped to disk (/s). 从内存到swap磁盘的进入速率 kb/s IO (内存为参照) bi: Blocks received from a block device (blocks/s). 从块设备读数据到内存的速率 bk/s bo: Blocks sent to a block device (blocks/s). 保存数据到磁盘的速率 bk/s System in: The number of interrupts per second, including the clock. 中断速率 cs: The number of context switches per second. 上下文切换速率 CPU These are percentages of total CPU time. us: Time spent running non-kernel code. (user time, including nice time) 用户空间占用CPU比例 sy: Time spent running kernel code. (system time) 内和空间占用CPU比例 id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time. 空闲比例 wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle. 等待I/O操作完成的时间比例 st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown. 被虚拟化占用的比例 —————————————————————————————————————————————————————————————————————————————————————————————————— ************************************************************************************************************* 9、pmap 显示进程内存映射表 (读取/proc/PID/maps文件下的信息) 格式: pmap [options] PID [PID ...] 选项: -s PID # 显示指定PID进程的打开的文件存放地址 -x # 显示扩展格式的信息 dirty字段,表示没有一次完整的事务完整。 ************************************************************************************************************* 10、glances 还可以基于C/S架构的方式进行监控。 格式: glances [-bdehmnrsvyz1] [-B bind] [-c server] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output] 内置命令: a Sort processes automatically l Show/hide logs c Sort processes by CPU% b Bytes or bits for network I/O # 以字节 m Sort processes by MEM% w Delete warning logs p Sort processes by name x Delete warning and critical logs i Sort processes by I/O rate 1 Global CPU or per-CPU stats # 显示CPU信息格式 d Show/hide disk I/O stats # 磁盘状态 h Show/hide this help screen f Show/hide file system stats # 显示文件系统信息 t View network I/O as combination # 当前传输速率 n Show/hide network stats u View cumulative network I/O # 累积传输容量 s Show/hide sensors stats z Show/hide processes list # 是否显示进程列表信息 y Show/hide hddtemp stats q Quit (Esc and Ctrl-C also work) 选项: -b # 以Byte为单位显示网卡速率 -d # 关闭磁盘I/O模块 -m # 关闭mount模块 -n # 禁用网络模块 -t # 延迟时间间隔,即刷新时间 -1 # 每个CPU的相关数据单独显示 -f /path/to/somefile # 设定输出文件位置及其格式 -s # 表示作为glances服务器端 -B # 绑定IP地址 示例: # 输出html格式的文档 glances -o HTML -f /var/www/html # 客户端/服务器端 方式监控 1、确保客户端/服务器端都安装glances 2、在服务器端启动 glances -s -b IP 3、客户端查看 glances -c IP ************************************************************************************************************* 11、dstat 格式: dstat [-afv] [options..] [delay [count]] delay 刷新时间 支持插件功能。 选项: -c # 启用CPU状态信息显示 -C # 显示指定CPU的信息 -d # 启动磁盘状态信息显示(默认) -D # 启动指定磁盘的状态信息 -g # 显示页面换进换出的信息 -i # 显示中断的信息 -m # 显示内存相关统计信息 -n # 显示网络相关统计信息 -p # 显示进程信息 -r # 显示I/O请求的读取数据 -s # 交换内存的相关统计数据 -t # 输出当前时间信息 --socket # 显示socket信息 --tcp # 显示tcp状态信息 --udp --unix --top-cpu # 上一刻最占用CPU的进程 --top-io --top-mem --top-lantency # 延迟最大的进程 ************************************************************************************************************* 12、kill 向进程发送控制信号实现对进程的管理。 格式: kill [-s signal|signal_nu] pid... 选项: -s # 指定要发送的信号。这个信号可以是名称或数字 -l # 列出所有的信号 或者使用 trap -l 显示 信号: ***注:查看帮助 man 7 signal*** 15 SIGTERM # 作为一个请求发送给进程,当Linux关机时,就是发送此信号给各进程。kill命令默认是这个信号 优雅关闭 1 SIGHUB # 通知进程重读配置文件 2 SIGINT # 终止正在运行的进程 Ctrl+c 9 SIGKILL # 强制终止正在运行的进程 18 SIGCONT # 继续运行进程 19 SIGSTOP # 停止进程 3 SIGQUIT # 相当于Ctrl + \ ,离开进程 0 # 判断进程是否处于正常状态 ***注:kill -0 PID &> /dev/null || service httpd restart 服务不正常,则立即重启*** killall # 杀死进程相关的所有进程 killall -SIG Program 选项: -i # 交互式询问是否杀死进程 -I # 忽略进程名称的大小写 1 13、unit 文件编写 每一个unit ************************************************************************************************************* 13、调整nice值 ***注:普通用户只能调低优先级,不能调高优先级。*** # 调整已启动的进程的nice值 renice -n N NEW_NICE PID # N的范围为-20~19 # 启动某个程序时指定它的nice值(以指定的优先级运行) nice -n NICE COMMAND ****注:如果不使用-n选项指定,则-3表示优先级是3,--3表示优先级为-3**** ************************************************************************************************************* 14、uptime 当前时间 | 系统已启动的时间 | 当前上线人数 | 系统平均负载(1 、5 、10 分钟的平均负载,一般不会超过1)  系统平均均负载: [指在特定时间间隔内运行队列中的平均进程数] 通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU 内核的任务数大于5,那么此主机的性 能有严重问题如果linux主机是1个双核CPU,当Load Average为6的时候说明机器已经被充分使用。 ************************************************************************************************************* 15、iostat 显示设备的I/O的速率 iostat N /dev/sdb N表示刷新频率 ************************************************************************************************************* 16、free 选项: -b # 以字节为单位显示 -k # 以kb为单位显示 -m # 以M为单位显示 -g # 以GB为单位显示 -h # 自动显示易读的单位 -t # 显示内存的总计栏目信息 -s N # 每 N 秒显示一次结果 -c N # 配个s选项,每N秒显示一次,总共显示几次 -w # 显示长格式 ************************************************************************************************************* 17、fuser 查看文件或者目录正在被那个进程使用或打开 格式: fuser option FILE_NAME|DIR_NAME 选项: -u # 显示使用该文件的进程PID的时列出用户名 -v # 列出打开该文件的命令 -k # 将使用该目录的进程终止 -i # 和-k一起使用,终止之前询问 ************************************************************************************************************ 18、lsof lost open files 列出打开的文件 默认情况下,将列出所有进程的打开的所有文件。 FD文件描述符标志: cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改 txt 类型的文件是程序代码 3u 最后,数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数 TYPE 字段含义: UNIX UNIX域套接字 FIFO 先进先出 (FIFO) 队列 IPv4 网际协议 (IP) 套接字 选项: -p PID # 指定PID。不仅会返回该应用程序所打开的文件,还会返回共享库和代码 -d ^txt # 指定文件描述符的类型 -a # 且的关系,表示两个条件必须同时满足 -i # 指定端口 示例: # 查看某个进程打开的文件 lsof -a -p 605 -d ^txt # 查看某文件是由那个进程打开 lsof /var/run/sendmail.pid # 查看监听某端口的进程 lsof -i :25 ============================================================================================================================================== ============================================================================================================================================== 三、任务控制 1、任务类型 前台任务 通过终端启动,且启动后一直占据终端 后台任务 可以通过终端启动,启动后转入后台运行 说明:无论是全台任务还是后台任务,都与当前终端有关,都是当前 bash 的子进程,只是将进程放到背景中执行。 2、将前台任务送入后台的方法 1、将前台任务放入后台不停止运行 COMMAND & 说明:如果 COMMAND 有标准错误输出或者标准时,都将输出到终端,解决方法:[ COMMAND > /dev/null & ] 2、将前台任务放入后台停止运行 Ctrl+z 3、后台任务管理 1、job命令 格式:jobs [-lnprs] ["%JOBS_ID" ...] 选项: -p # 只列出后台任务的PID -l # 列出后台任务的列表。+ 表示默认下一次被调用的任务; - 下一个被调用的作业 -r # 列出后台运行的任务 -s # 列出后台停止的任务 2、恢复后台任务到前台 fg ["%TASK_NAME|JOBS_ID"] 3、将后台休眠任务转为后台运行 bg ["%TASK_NAME|JOBS_ID"] 4、终止某个后台任务 kill -signal [%JOB_NUM] ***注:在CentOS7上,当网络连接断开时,后台任务会断开终止;在CentOS6上,当网络连接断开时,后台任务不会断开,而是把进程转接到init进程*** 4、让程序并行执行的方法 1、在一个脚本中同时调用程序,且后台执行 在脚本test.sh /root/file1.sh & /root/file2.sh & 2、(/root/file1.sh&);(/root/file2.sh&) 3、{ /root/file1.sh& /root/file2.sh& } 4、{ /root/file1.sh ; /root/file2.sh ; } & 5、让进程成为守护进程一直运行的方法 1、(COMMAND &) # 运行后的进程的父进程为 1 号进程 2、nohup COMMAND &> /dev/null & # ohup会将命令的输出放到当前目录下nohup.out文件中 3、通过 crond 服务进程调用 4、setsid 命令 # 例如:setsid ping 172.18.0.1 &> /dev/null & 5、screen ============================================================================================================================================== ==============================================================================================================================================