1、进程的概念进程是系统中正在运行的程序,它是操作系统资源分配和调度的基本单位。在Linux系统中,并非每个程序只能对应一个进程,有的程序启动后可以创建一个或多个进程,例如提供Web服务的httpd程序,当有大量用户同时访问web页面时,httpd程序可能会创建多个进程来提供服务。
在进程的运行过程中,通常会在3种基本状态之间转换:运行态、就绪态、等待态(阻塞态)。
运行态:是指当前进程已分配到CPU,它的程序正在处理器上执行时的状态。处于运行态的进程个数不能大于CPU的数目,在一般单CPU机制中,任何时刻处于运行态的进程最多有一个。就绪态:是指进程已具备运行条件,但因为其他进程正占用CPU,所以暂时不能运行而等待分配CPU的状态。一旦把CPU分给它,立即就可以运行。在操作系统中,处于就绪态的进程数目可以是多个。等待态(阻塞态):是指进程因等待某种事件发生(如等待某一输入、输出操作完成,等待其它进程发来的信号等)而暂时不能运行的状态。此时即使CPU空闲,等待态的进程也不能运行。系统中处于这种状态的进程也可以是多个。Linux系统中的进程使用数字进行标记,每个进程的身份标记号称为PID。如在Linux系统的启动过程中,“/sbin/init”是内核加载运行的第一个程序,相应的init进程对应的pid号永远为1。
2、服务的概念
在Linux中有一些特殊的程序,启动后就会持续在后台执行,等待用户或其它软件调用,这种程序称为服务。Linux系统中提供了很多服务,这些服务依照其功能可以区分为系统服务与网络服务。系统服务:某些服务的服务对象是Linux系统本身,或者是Linux系统中的用户。网络服务:Linux系统中更多的服务是用来提供给网络中的其他客户端调用。例如提供远程登录的sshd服务,提供网站浏览功能的httpd服务等。
3、init进程与系统运行级别
init服务是Linux系统中第一个被执行的程序,它主要负责建立系统使用环境,并确保系统正常运行。
init服务运行以后将陆续执行系统中的其它程序,不断生成新的进程,这些进程称为init进程的子进程,反过来说init进程是这些进程的父进程。这些子进程也可以进一步生成各自的子进程,依此不断繁衍下去,最终构成一棵枝繁叶茂的进程树,共同为用户提供服务。所以,init进程是维持整个Linux系统运行的所有进程的始祖,init进程是不允许被轻易终止的。
init服务的配置文件是/etc/inittab/etc/inittab文件的主要内容:
# Default runlevel. The runlevels used are: 关机状态,使用该级别时将会关闭主机 # 0 - halt (Do NOT set initdefault to this) 单用户模式,不需要密码验证即可登录系统,多用于系统维护 # 1 - Single user mode 字符界面的多用户模式(不支持网络) # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 字符界面的完整多用户模式,大多数服务器主机运行在此级别 # 3 - Full multiuser mode 未分配使用 # 4 - unused 图形界面的多用户模式,提供了图形桌面操作环境 # 5 - X11 重新启动,使用该级别时将会重启主机 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault: [root@justin ~]#若未能确知当前所处的运行级别,可以使用runlevel命令进行查询,输出结果中分别包含切换前的级别和目前的级别。查看系统的当前运行级别,若之前未切换过运行级别,第一列将显示“N”
[root@justin ~]# runlevel N 5 [root@justin ~]# init 3 [root@justin ~]# runlevel 5 3 [root@justin ~]#init命令只能临时切换运行级别,要实现永久切换必须修改配置文件/etc/inittab起实质作用的最后这一行:id:5:initdefault:,这一行决定了系统的默认运行级别。默认运行级别一般建议设置为5或3,千万不要设置为0或6,否则将导致系统无法启动。由于Linux主要是作为服务器操作系统,Linux服务器平时一般都是放置在数据中心机房中,由管理员对其进行远程管理。对Linux系统的管理操作一般都是在字符界面下通过命令完成的,很少用到图形界面,而且图形界面也要消耗更多的系统资源,同时也会导致系统不稳定,所以大多数情况下系统的运行级别都是被设置为3。
4、进程状态查看
ps命令——查看静态的进程统计信息
-A 显示所有进程(等价于-e)(utility) -a 显示一个终端的所有进程,除了会话引线 -N 忽略选择。 -d 显示所有进程,但省略所有的会话引线(utility) -x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility) -p pid 进程使用cpu的时间 -u uid or username 选择有效的用户id或者是用户名 -g gid or groupname 显示组的所有进程。 U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility) -f 全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on. -l 长格式(有F,wchan,C 等字段) -j 作业格式 www.2cto.com -o 用户自定义格式。 v 以虚拟存储器格式显示 s 以信号格式显示 -m 显示所有的线程 -H 显示进程的层次(和其它的命令合用,如:ps -Ha)(utility) e 命令之后显示环境(如:ps -d e; ps -a e)(utility) h 不显示第一行
ps -eo lstart 启动时间ps -eo etime 运行多长时间.显示了自从该进程启动以来,经历过的时间,格式为 [[DD-]hh:]mm:ss。ps -eo etimes 运行多长时间.显示了自该进程启动以来,经历过的时间,以秒的形式。
[root@Super ~]# ps -p 17274 -o etimes ELAPSED 683680 [root@Super ~]# ps -p 17274 -o etime ELAPSED 7-21:54:44 [root@Super ~]#-C cmdline 列出指定命令的状况 --no-header 忽略头部
cmdline为完整命令行,可以理解成启动程序的执行文件,如nginx、redis-server等
[root@localhost logs]# ps -C haproxy PID TTY TIME CMD 1943 ? 00:00:00 haproxy 1944 ? 00:00:00 haproxy [root@localhost logs]# ps -C haproxy --no-header 1943 ? 00:00:00 haproxy 1944 ? 00:00:00 haproxy [root@localhost logs]#[root@justin ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 2137 2135 0 80 0 - 1714 - pts/0 00:00:00 bash 4 R 0 2336 2137 0 80 0 - 1619 - pts/0 00:00:00 ps [root@justin ~]#[root@justin ~]# ps -aux|more Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 2880 1492 ? Ss Oct21 0:02 /sbin/init root 2 0.0 0.0 0 0 ? S Oct21 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S Oct21 0:00 [migration/0]aux:
UID:用户ID PID:进程ID PPID:父进程ID C:CPU用于计算执行优先级的因子。数值越大,表明进程是CPU密集型运算,执行优先级会降低;数值越小,表明进程是I/O密集型运算,执行优先级会提高 STIME:进程启动的时间 TTY:完整的终端名称 TIME:CPU时间 CMD:完整的启动进程所用的命令和参数
-ef:
USER:用户名称 PID:进程号 %CPU:进程占用CPU的百分比 %MEM:进程占用物理内存的百分比 VSZ:进程占用的虚拟内存大小(单位:KB) RSS:进程占用的物理内存大小(单位:KB) TT:终端名称(缩写),若为?,则代表此进程与终端无关,因为它们是由系统启动的 STAT:进程状态,其中S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等 STARTED:进程的启动时间 TIME:CPU时间,即进程使用CPU的总时间 COMMAND:启动进程所用的命令和参数,如果过长会被截断显示
如果想查看进程的CPU占用率和内存占用率,可以使用aux 如果想查看进程的父进程ID和完整的COMMAND命令,可以使用ef
查看某个进程文件的启动位置
通过ps查看进程的PID,进入/proc/pid通过ls -al查看,cwd就是你要查找进程的位置,exe连接的就是启动的文件
查看线程
ps -Lf pid 查看对应进程下的线程数
[root@localhost ~]# ps -Lf 21804 UID PID PPID LWP C NLWP STIME TTY STAT TIME CMD root 21804 1 21804 0 3 Aug23 ? Ssl 1:00 /app/redis/bin/redis-server 0.0.0.0:8003 root 21804 1 21806 0 3 Aug23 ? Ssl 0:00 /app/redis/bin/redis-server 0.0.0.0:8003 root 21804 1 21807 0 3 Aug23 ? Ssl 0:00 /app/redis/bin/redis-server 0.0.0.0:8003 [root@localhost ~]#ps -mq PID 看到指定的进程产生的线程数目。
[root@localhost ~]# ps -mq 21804 PID TTY TIME CMD 21804 ? 00:01:00 redis-server - - 00:01:00 - - - 00:00:00 - - - 00:00:00 - [root@localhost ~]#ps -xH 查看所有存在的线程,也可以使用grep作进一步的过滤。
ps -T -p <pid> “-T”选项可以开启线程查看
[root@localhost ~]# ps -T -p 21804 PID SPID TTY TIME CMD 21804 21804 ? 00:01:00 redis-server 21804 21806 ? 00:00:00 redis-server 21804 21807 ? 00:00:00 redis-server [root@localhost ~]#SPID表示线程ID,而“CMD”栏则显示了线程名称。
top -H -p <pid> 显示特定进程<pid>运行的线程状况
[root@localhost ~]# top -H -p 21804 top - 21:03:00 up 65 days, 14:04, 4 users, load average: 0.58, 0.54, 0.47 Threads: 3 total, 0 running, 3 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.6 us, 0.5 sy, 0.0 ni, 98.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 13186529+total, 10831592 free, 11688337+used, 4150328 buff/cache KiB Swap: 16776188 total, 1034656 free, 15741532 used. 14501072 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 21804 root 20 0 131356 1204 208 S 0.0 0.0 1:00.28 redis-server 21806 root 20 0 131356 1204 208 S 0.0 0.0 0:00.00 redis-server 21807 root 20 0 131356 1204 208 S 0.0 0.0 0:00.00 redis-serverulimit -s 可以查看默认的线程栈大小,一般情况下,这个值是 8M[8192]
[root@localhost ~]# ulimit -s 8192 [root@localhost ~]#查看最大线程数:cat /proc/sys/kernel/threads-max
[root@localhost ~]# cat /proc/sys/kernel/threads-max 1029958 [root@localhost ~]#top命令——查看进程动态信息
top命令将会在当前终端以全屏交互式的界面显示进程排名,及时跟踪包括CPU、内存等系统资源占用情况,默认情况下每3秒钟刷新一次,其作用类似于Windows系统中的“任务管理器”。由于过于消耗资源,所以在生产环境中top命令用的比较少
[root@justin ~]# top top - 00:49:40 up 2:50, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 92 total, 1 running, 88 sleeping, 3 stopped, 0 zombie Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.6%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st Mem: 1030796k total, 172808k used, 857988k free, 22008k buffers Swap: 2097144k total, 0k used, 2097144k free, 108184k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2493 root 20 0 2652 1076 868 R 0.2 0.1 0:00.24 top 1 root 20 0 2880 1492 1268 S 0.0 0.1 0:02.29 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
第三行:cpu状态
6.7% us — 用户空间占用CPU的百分比。
0.4% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
92.9% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si — 软中断(Software Interrupts)占用CPU的百分比
us占比高,wa低,说明系统缓慢的原因在于进程占用大量CPU,通常还会伴有教低的id,说明CPU空转时间很少;
wa低,id高,可以排除CPU资源瓶颈的可能。
wa高,说明I/O占用了大量的CPU时间,需要检查交换空间的使用,交换空间位于磁盘上,性能远低于内存,当内存耗尽开始使用交换空间时,将会给性能带来严重影响,所以对于性能要求较高的服务器,一般建议关闭交换空间。另一方面,如果内存充足,但wa很高,说明需要检查哪个进程占用了大量的 I/O资源。
第四行Mem行展示了当前内存的状态,total是总的内存大小,userd是已使用的,free是剩余的,buffers是目录缓存。
第五行Swap行同Mem行,cached表示缓存,用户已打开的文件。如果Swap的used很高,则表示系统内存不足。
PID----进程id
USER--进程所有者的用户名
PR-----进程的优先级
NI------nice值,负值表示更高的优先级,正值表示低优先级
VIRT---进程使用的虚拟内存总量,单位为kb。其中VIRT=SWAP RES
RES----进程使用的、未被换出的物理内存的大小,单位为kb。
SHR---共享内存的大小,单位为kb
S-------进程状态
D---不可中断的睡眠状态
R---运行
S---睡眠
T---跟踪/停止
Z---僵尸进程
%CPU--上次更新到现在的CPU时间占用比
%MEM--进程使用的物理内存百分比
TIME ---进程使用的CPU时间总计,单位为1/100秒
COMMAND---命令行/命令名,
按c键可以查看command的详细命令
i忽略闲置和僵尸进程。这是一个开关式的命令;
更改显示列的方法:
a)通过f键可以选择显示的内容,按f键后会显示列的列表,按a-z即可显示或隐藏对应的列,最后按回车键确定;
b)按o键可以改变列的显示顺序。按小写的a-z可以将相应的列向右移动,而大写的A-Z可以将相应的列向左移动。最后按回车键确定;
c)按大写F或O键,然后按a-z可以将进程按照相应的列进行排序。而大写的R键可以将当前的排序倒转;
在top界面直接输入top指令就可以做显示做相应筛选
命令参数:
-b 批处理
-c 显示完整的治命令
-I 忽略失效过程
-s 保密模式
-S 累积模式
-i<时间> 设置间隔时间,模式3s
-u<用户名> 指定用户名
-p<进程号> 指定进程
-n<次数> 循环显示的次数
[root@localhost ~]# top -n 5 -i1 -p 1190 -c敲击键盘“x”(打开/关闭排序列的加亮效果)
通过”shift + >”或”shift + <”可以向右或左改变排序列
查看指定进程
[root@localhost ~]# pidof mongod 30172 [root@localhost ~]# top -p `pidof mongod` top - 09:34:53 up 26 days, 22:07, 1 user, load average: 0.03, 0.05, 0.05 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.6 us, 0.1 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 65809140 total, 4673868 free, 23277540 used, 37857732 buff/cache KiB Swap: 16777212 total, 16776044 free, 1168 used. 42127064 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 30172 root 20 0 25.958g 0.021t 8868 S 10.3 34.6 1481:53 mongodpidof查看进程PID
cpu使用率load average的简单理解
load average后面有由逗号分割的3列数字,分别代表了最近1分钟,5分钟,15分钟CPU的平均负载情况:
如果是单核CPU的话,1.00就表示CPU已经满负荷了,
如果是多核CPU的话,load average达到CPU的核数即说明该CPU已经满负荷了,
如果是多颗物理CPU,则当load average达到所有物理CPU的总核数时,说明系统CPU满负荷了。
简而言之,CPU的核数即为我们根据load average衡量CPU负载的依据,当load average等于CPU的核数时,表示CPU在满负荷运行。
按大键盘上的数字键1(感叹号的1)可以查看每个CUP的使用率,top里显示的是把所有使用率加起来的,所以用top命令查看cpu利用率时会超过100%
核数可以通过命令cat /proc/cpuinfo | grep "core id" | uniq | wc -l查看数值, 这里不包含超线程技术HT虚拟出来的核心,因为超线程虚拟出来的核心性能不及真实核心的30%,
1分钟的数据更能反映CPU负载的实时情况,而15分钟的数据则说明系统稳定在某一情况,更有指示价值,监视一个系统的负载情况的话最好是取15分钟的load average值。那么当CPU负载达到哪个值时,就该引起我们注意了呢?按照参考文章给的经验值是CPU核数乘以0.7,即如果CPU总核数为4,当load average上15分钟的数值达到2.8时,我们就该好好进系统看看了。
进程控制
1、程序后台运行
让操作在后台运行只需要在命令结尾加上符号&
[root@justin ~]# top & [1] 4299 [root@justin ~]#
显示的信息为任务编号1和pid为4294
2、挂起进程:ctrl+z
当需要将当前在执行的命令暂停时直接按ctrl+z组合键就可以挂起当前进程,这种操作在需要暂停当前进程并进行其它操作时特别有用。
3、查看后台程序:
[root@justin ~]# jobs -l [1]+ 4299 停止 (tty 输出) top [root@justin ~]#
4、将后台程序调入前台运行:fg 任务编号
[root@justin ~]# fg 1
5、终止进程
ctrl+c:当命令在前台执行过程中需要停止该进程可以直接按住该组合键
kill:当程序在后台运行我们只需要知道该进程的PID就可以终止该进
HUP (1)、KILL (9)、TERM (15)分别代表著重跑, 砍掉, 结束; 详细的信号可以用 kill -l
[root@justin ~]# jobs -l [1]+ 4436 停止 (信号) top [root@justin ~]# kill -9 4436 [root@justin ~]# jobs -l [1]+ 4436 已杀死 top [root@justin ~]#服务管理
1、serveice
通过service命令可以查看(status)、启动(start)、停止(stop)或者重启(restart)服务
[root@justin ~]# service httpd status httpd is stopped [root@justin ~]# service httpd start Starting httpd: httpd: apr_sockaddr_info_get() failed for justin httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName [ OK ] [root@justin ~]# service httpd stop Stopping httpd: [ OK ] [root@justin ~]# service httpd start Starting httpd: httpd: apr_sockaddr_info_get() failed for justin httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName [ OK ] [root@justin ~]# service httpd restart Stopping httpd: [ OK ] Starting httpd: httpd: apr_sockaddr_info_get() failed for justin httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName [ OK ] [root@justin ~]#
2、chkconfig
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。
[root@justin ~]# chkconfig --list httpd httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off [root@justin ~]# chkconfig --add httpd [root@justin ~]# chkconfig httpd on [root@justin ~]# chkconfig --list httpd httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@justin ~]# chkconfig --level 24 httpd off [root@justin ~]# chkconfig --list httpd httpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off [root@justin ~]#
1、如果添加服务时候提示:service httpd does not support chkconfig;可在#!/bin/bash 之后,添加以下两行
# chkconfig: 2345 10 90
# description: httpd server ....
注意:chkconfig description后面有冒号,不能省略,否则也会报以上错误
其中2345是默认启动级别,级别有0-6共7个级别。
等级0表示:表示关机
等级1表示:单用户模式
等级2表示:无网络连接的多用户命令行模式
等级3表示:有网络连接的多用户命令行模式
等级4表示:不可用
等级5表示:带图形界面的多用户模式
等级6表示:重新启动
10是启动优先级,90是停止优先级,优先级范围是0-100,数字越大,优先级越低。
2、如果使用服务时候提示:Warning: redis.service changed on disk. Run 'systemctl daemon-reload' to reload units.;可运行systemctl daemon-reload
[root@localhost app]# systemctl stop redis.service Warning: redis.service changed on disk. Run 'systemctl daemon-reload' to reload units. [root@localhost app]# systemctl daemon-reload [root@localhost app]# systemctl stop redis.service [root@localhost app]#