欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

进程和线程,vmstat,iostat,dstat,

程序员文章站 2024-03-24 14:17:40
...

PS:问题:磁盘空间使用率100%,导致不能正常的进入系统,修改文件不能保存。
原因是:日志接受功能打开,/var/log/相关日志文件使用了所有的剩余空间,个别文件(secure、messages)达到320G,建议关闭日志接受功能。
磁盘使用率达到100%是block块使用光(df查看时看到的是block块消耗)。不是inode使用完了。


程序—>一堆代码趟在哪里不动—》静态—》c、java、php、c++等
进程—》程序–》内存里执行—-》动态
资源(内存、磁盘、cpu、网络带宽、电)
开销–》程序运行起来会占用资源–》开销

进程的定义

一个进程是一个程序对某个数据集的执行过程,是分配资源的基本单位。
进程=PCB+程序段+数据结构集

一、进程控制块(PCB —》process control block)

PCB 是系统感知进程存在的唯一凭证。
是数据结构,占用内存空间。

  • 1.描述信息:pid 进程名 父子shell的家族关系等
  • 2.控制信息:进程当前状态、进程优先级等
  • 3.资源管理信息:占多少内存,打开了多少个文件等
  • 4.cpu现场保护结构
  • fork() 函数或者系统调用
二、有关程序段

—-》应用程序代码

三、该程序段对其进行操作的数据结构集

—》被程序操作的数据

以豆浆机为例: pcb 其实就是豆浆机的品牌、型号、大小、颜色、好的还是坏的等信息 有关程序段—》豆浆机这个机器
该程序段对其进行操作的数据结构集—》黄豆、黑豆等加工的源材料。

进程和线程的关系:

  • 进程包含线程。
  • 在cpu里运行的时候,线程会被当做进程来处理。

清华大学出版社:p42
寄存器是*处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在*处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在*处理器的算术及逻辑部件中,寄存器累加器(ACC)。

什么是进程上下文?

  • 上文:已执行过的进程指令和数据在相关寄存器和堆栈中的内容称为上文
  • 正文:正在执行的指令和数据在相关寄存器和堆栈中的内容
  • 下文:待执行的指令和数据在相关寄存器和堆栈中的内容

数据结构:

  • stack 栈
    堆、栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。
    • 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
    • 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

进程上下文切换过程

上下文切换(Context Switch)

  • 多任务系统中,上下文切换是指CPU的控制权由运行任务,转移到另外一个就绪任务时所发生的事件。
  • 在操作系统中,CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态:当前运行任务转为就绪(或者挂起、删除)状态,另一个被选定的就绪任务成为当前任务。上下文切换包括保存当前任务的运行环境,恢复将要运行任务的运行环境。
  • 进程上下文用进程的PCB(进程控制块,也称为PCB,即任务控制块)表示,它包括进程状态,CPU寄存器的值等。
  • 通常通过执行一个状态保存来保存CPU当前状态,然后执行一个状态恢复重新开始运行。

PS:几个计算机专业英文单词:

resume:恢复;简历。
suspend:挂起。
interrupt:中断 interrupt。(int)
thread:线程
process:进程
context switch:上下文切换(csw)

用户态和内核态

内存划分为:用户空间和内核空间

  • 在用户空间里运行的进程,就是用户进程,所属的状态为用户态
  • 在内核空间里运行的进程,就是系统进程,所属的状态为内核态
  • 执行内核里的代码的时候,就是属于内核态。
  • 内核空间的进程可以访问用户空间,但是用户空间的进程不能访问内核空间。
  • top命令可以查看到用户态的进程和内核态的进程分别消耗了cpu的情况。正常情况应该用户态消耗cpu多。

用户态切换到内核态的3种方式

  • a. 系统调用

    这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int
    80h中断。

  • b. 异常

    当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

  • c. 外围设备的中断

    当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

内核的作用:

  • cpu的调度管理
  • 内存的管理
  • 文件系统的管理
  • 其他硬件的管理
  • 进程的管理

进程:一个进程可以包含很多线程

apache提供web服务,默认情况下采用进程的方式为用户提供web服务,一个用户对应一个进程。

进程和线程2种方式进行对比:

  • 进程方式比较稳定,一个进程死了,不会影响其他的进程,但是比较耗资源。
  • 线程方式开销比较小,节约内存和cpu的资源。可以同时应付大量的并发连接,但是缺点是一个进程死了,会殃及这个进程里的所有线程。不是非常稳定可靠。

进程树pstree

# pstree -p|grep firefox    
        |-firefox(4651)-+-plugin-containe(16190)-+-{plugin-contain}(16191)
        |               |-{firefox}(4669)
        |               |-{firefox}(4670)
        |               |-{firefox}(4671)
        |               |-{firefox}(4672)
        |               |-{firefox}(4673)
        |               |-{firefox}(4674)
        |               |-{firefox}(4676)
        |               |-{firefox}(4685)
        |               |-{firefox}(4686)
        |               |-{firefox}(4688)
        |               |-{firefox}(4689)
        |               |-{firefox}(4690)
        |               |-{firefox}(4693)
        |               |-{firefox}(4694)
        |               |-{firefox}(4695)
        |               |-{firefox}(4696)
        |               |-{firefox}(4807)
        |               |-{firefox}(16792)
        |               |-{firefox}(16793)
        |               `-{firefox}(16920)
# yum install httpd -y
# service  httpd restart   httpd服务默认情况下是以进程的方式提供web服务的。

PS:

apache和nginx都是提供web服务的软件。

  • apache 默认情况下使用进程的方式工作,追求稳定
  • nginx 采用线程的方式工作,追求高效率,大并发。

子进程和父进程的关系

一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本
UNIX将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。

进程和线程,vmstat,iostat,dstat,

虚拟内存的理解:

虚拟内存=物理内存+swap交换分区的大小
分页paging:—》对物理内存进行分页

使得进程中的数据空间增大,增大到多少与硬件有关,对于一个32位的芯片,进程中的数据空间可以为4G[2^32],对于64位的芯片则支持2^64大小 的空间。这一点使得进程自身可操作的空间大大增加。

分页的过程其实类似于文件系统里划分块的过程,是逻辑的划分。 每个页的大小为4k

page-in、page-out理解

理解使用交换分区swap的使用

分页(Page)写入磁盘的过程被称作Page-Out(移动到硬盘的交换分区中),
分页(Page)从磁盘重新回到内存的过程被称作Page-In。(出磁盘,进内存)

常用进程管理命令

vmstat —>yum install procps
iostat —>yum install sysstat
dstat —>yum install dstat
进程和线程,vmstat,iostat,dstat,

ps aux命令

进程和线程,vmstat,iostat,dstat,

ps命令会显示的:

  • <:high-priority (not nice to other users)–》自己高优先级
  • N:low-priority (nice to other users) –》对别人nice,自己低优先级
  • L:has pages locked into memory (for real-time and custom IO)
  • s:is a session leader –》会话首进程
  • l:is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
  • +:is in the foreground process group

top命令

进程和线程,vmstat,iostat,dstat,

①top:动态显示进程的信息,ps是静态的显示

09:46:35 up 1:02, 1 user, load average: 0.02, 0.03, 0.00
-》当前系统的时间 系统启动运行多久
②load average: 0.02, 0.03, 0.00 cup最近的1、5、15分钟的负载
-》何为系统负载呢?

系统平均负载被定义为在特定时间间隔内运行队列中的平均进程数。如果一个进程满足以下条件则其就会位于运行队列中:
a.它没有在等待I/O操作的结果
b.它没有主动进入等待状态(也就是没有调用’wait’)
c.没有被停止(例如:等待终止)
一般来说,每个CPU内核当前活动进程数(就绪状态进程数)不大于3,则系统运行表现良好!当然这里说的是每个cpu内核,也就是如果你的主机是四核cpu的话,那么只要uptime最后输出的一串字符数值小于12即表示系统负载不是很严重.当然如果达到20,那就表示当前系统负载非常严重,估计打开执行web脚本非常缓慢.

③nice值是用来调整进程的权重值,谁的权重值大,谁就去cpu里运算。

weight=counter+priority-nice 。cpu在调度的时候根据此公式计算优先级。
counter是进程可用的时间片的动态优先级。 priority 值是一个常数,固定为20 nice是系统允许用户设置的一个进程优先数偏移值(调整值),linux里nice值默认为0,但是进程可以设置的范围-20~19之间的值。
nice值为正值,对别的进程友好;为负值,对自己友好。

**④top里的PR的值是下面公式计算的
priority=priority+nice**
–》Top里,PRI值越小,优先级越高!!

top用法:

  • top -d 5 –》每隔5秒刷新显示一次
  • h是获得帮助
  • shift+>和shift+< 往上和下翻进程
  • q 退出
  • M 按照内存(memory)使用率排序
  • P 按照cpu(processer)使用率排序 —> 默认情况
  • k kill
  • r renice 重新设置nice值
  • 1—》查看cpu个数,各个核使用情况 —-》数字1
  • f 更改显示内容
  • c(小写):切换显示命令名称和完整命令行。 显示完整的命令。 这个功能很有用。
[aaa@qq.com txy]# top -n 1 -M  >top.txt
# kill -l 
1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
43) SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
63) SIGRTMAX-1    64) SIGRTMAX    

PS:
(15)sigterm:终止进程。让进程自我结束。
(9)sigkill:杀死 所以,杀死进程时,常用 kill -9。
(2)sigint:中断进程。按Ctrl+c强行终止。

trap

trap:命令屏蔽信号

# cat while.sh 
#当出发中断信号(ctrl+c)或者kill -15 执行echo sorry,i am busy
trap "echo sorry,i am busy" 2 15
i=1
while :
do
  echo $i
  ((i++))
  sleep 1
done 

uptime

显示top命令的最上面一行信息

# uptime
 15:09:04 up  7:31,  3 users,  load average: 0.00, 0.00, 0.00

PS:

ctrl+z –》将程序调入到后台
jobs –》查看后台的程序
fg 1 –》恢复到前台执行 bg 1 。将后台程序有stopped状态让它变成running

# jobs
[2]-  Stopped                 vim cc.txt
[3]   Stopped                 vim dd.txt
[4]   Stopped                 vim uu.txt
[5]+  Stopped               ping www.baidu.com
(+代表最近放到后台的进程;-代表倒数第2个被放到后台的进程)
# bg 5      --》将ping www.baidu.com放到前台执行。
# kill -9 %2  杀死后台挂起的第2个任务进程
# pkill -9 vim  根据名字来杀死进程

dstat

  • 动态的显示cpu、磁盘、网络带宽等使用信息。

进程和线程,vmstat,iostat,dstat,
(ctrl+z 退出)

vmstat(可以接-n 2,每2秒显示一次)

  • 显示内存的使用信息。

进程和线程,vmstat,iostat,dstat,
(ctrl+z 退出)

#free -m    --》可以算出来
# free -m
             total              used       free     shared    buffers     cached
Mem:     981                763        217          0         60             474
-/+ buffers/cache:       229        751
Swap:    1983                 0         1983

PS:
tocal1=used1+free2
tocal1=used2+free2
used1=buffers1+cached1+used2
free2=buffers1+cached1+free1

手动释放缓存

关键配置文件:/proc/sys/vm/drop_caches
此文件记录了缓存释放的参数。默认为0,共0-3

  • 0-不释放
  • 1-释放页缓存
  • 2-释放dentries和inodes
  • 3-释放所有缓存

(改成1即可:echo 1>/proc/sys/vm/drop_caches)
(修改后立即生效,可以用#free -m查看)

iostat命令

iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

入门用法: iostat -d -k 2
参数 :

  • -d:表示,显示设备(磁盘)使用状态;
  • -k:某些使用block为单位的列强制使用Kilobytes为单位;
  • 2:数据显示每隔2秒刷新一次。

常见用法:

  • iostat -d -k 1 10 #查看TPS和吞吐量信息(磁盘读写速度单位为KB)
  • iostat -d -m 2 #查看TPS和吞吐量信息(磁盘读写速度单位为MB)
  • iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await)
  • iostat -c 1 10 #查看cpu状态

iptraf命令

进程和线程,vmstat,iostat,dstat,
(看谁连到这台linux,并且能看到网卡流量是否跑满)

小结:

查看linux系统性能的工具命令:

vmstat(内存使用信息)
dstat(动态,cpu、磁盘、带宽)
iostat(监控系统设备的IO负载情况)
top(动态的显示进程)
htop(扩展了功能的top)
ps(静态的显示进程)
free -m(内存使用情况)
iptraf(看网卡流量)

思考练习:

突然机器特别慢,ssh过去特别慢,敲一个命令感觉很慢,如何分析?
分析思路:
1、带宽问题:
dstat、iptraf –》网络是否跑满
9ping的问题(公司内网、运营商网络、服务器(托管机房的)内网、)
2、cpu的使用率(top、htop、dstat)
3、内存的使用率(dstat -m、vmstat)
4、磁盘的I/O(dstat、iostat)