老话长谈,先说明下进程,线程,协程的概念
进程:
- 进程是系统资源分配和调度的基本单位,是线程的容器,对于linux系统来说用PID来标识进程。
-
进程拥有自己的资源,它有自己的地址空间,会包括代码,数据,堆栈段(代码段存储处理器执行的代码,数据段存储变量和进程执行期间使用动态分配的内存,堆栈段存储活动过程中调用的指令和本地变量)
image
-进程是执行中的程序,也就是操作系统运行程序的时候产生。我们说其是一个进程
多进程适用场景:
web服务,游戏,等需要数据和错误隔离的场景
(python程序中因为GIL锁的存在,对于计算密集的程序必须要使用多进程才能利用上多CPU)
线程:
- 线程是cpu执行的最小单位,每个进程至少有一个线程,进程会为自己的线程分配id标识。
- 线程不拥有系统资源,只拥有运行时候的一些资源。单进程多线程时候共享进程的资源,所以之间会相互制约
,线程也有就绪、阻塞和运行三种基本状态 - 线程提供较轻的上下文切换开销 ,不用切换地址空间,不用更改寄存器,不用刷新TLB。
总线程数<= CPU数量:并行运行
总线程数> CPU数量:并发运行
多线程适用场景:
线程间有数据共享,并且数据是需要修改的。
单任务并行计算,在非CPU Bound的场景下提高响应速度,降低时延。
与人有IO交互的应用,良好的用户体验(键盘鼠标的输入,立刻响应)。
协程:
- 协程属于用户在单线程里面控制程序执行顺序,也叫做用户态线程。
- 主要用在IO等待和时钟阻塞上面。利用了程序wait时间将程序挂起然后执行其他程序更好的利用CPU时间片和更轻的上下文管理
web服务器中程序应用性能指标
qps:一秒钟内完成的请求数量
rt: 一个请求完成的时间
Tic: 线程的cpu计算时间
Tiw:线程的等待时间(io/网络/锁)
Tn: 线程数
Tno:最佳线程数
Cn:cpu核数
Cu:cpu使用率
rt = Tic + Tiw
qps = 1000/rt
最佳线程数
Tno = (Tic+Tiw)/Tic
现代计算机都是多核
qps = (1000/rt)CnCu
使用多线程时候
qps =1000* Tn(Tic+Tiw)Cn*Cu/Tic
可以看到qps的大小只和Tc成反比,也就是说要增大qps只要减小Tic就可以了。
Cic:协程执行时间
Ciw:协程阻塞等待时间
Cno:协程最佳数量
协程计算公式 其实和线程一样(只是协程只适用于IO和时钟阻塞,因为受限于线程。它相当于在单一CPU上运行)
Cno = (Cic+Ciw)/Cic
所以python程序一般使用多进程和多协程一起使用较好。
服务器性能:
cpu使用率:程序在运行期间实时使用的cpu比率。
load:代表着一段时间内正在使用和等待使用cpu的任务平均数,
机器的load很高,但是应用的qps、rt都不高,这种情况可能有以下几种原因:
其他资源导致cpu利用率上不去,大量线程在执行其他动作或者在等待,比如io的速度太慢,内存gc等。
如果系统资源不是瓶颈,则由可能是锁竞争、后端依赖的服务吞吐低、没有充分利用多核资源,多核却使用单线程。
查看机器load高的常见方法:
- 机器的io(磁盘io、网络io):vmstat、iostat、sar -b等。
- 网络io:iftop、iptraf、ntop、tcpdump等。
- 内存:gc、swap、sar -r。
- 锁竞争、上下文切换、后端依赖
磁盘io和网络io其实对于linux系统来说都是对文件操作读和写,
IOPS,IO系统每秒所执行IO操作的次数,是一个重要的用来衡量系统IO能力的一个参数。
IOPS计算公式
一个IO所用的时间=寻道时间+数据传输时间。
IOPS=IO并发系数/(寻道时间+数据传输时间)
IOPS 查看命令iostat
传输速度和吞吐率
传输速度和吞吐率是指的磁盘系统总线上流过的数据量或者网络传输一段时间传输的数据量
响应时间
IO响应时间也被称为IO延时(IO Latency),IO响应时间就是从操作系统内核发出的一个读或者写的IO命令到操作系统内核接收到IO回应的时间。等于IO操作时间和等待时间
IO性能调优
磁盘io调优
磁盘io调优利用内存和批处理,总结起来如下几个方法:
- 文件系统缓存
- 最小分配
- io访问调度
- 预读取
- 延迟分配
网络io调优
iptraf, tcpdump
1.协议参数调优
2.利用缓存和CDN
3.适用的IO模型
网友评论