进程,线程,协程在服务器中如何正确使用

2018-11-18  本文已影响0人  shop271

老话长谈,先说明下进程,线程,协程的概念

进程:

多进程适用场景:
web服务,游戏,等需要数据和错误隔离的场景
(python程序中因为GIL锁的存在,对于计算密集的程序必须要使用多进程才能利用上多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其实对于linux系统来说都是对文件操作读和写,

IOPS,IO系统每秒所执行IO操作的次数,是一个重要的用来衡量系统IO能力的一个参数。
IOPS计算公式
一个IO所用的时间=寻道时间+数据传输时间。
IOPS=IO并发系数/(寻道时间+数据传输时间)
IOPS 查看命令iostat

传输速度和吞吐率
传输速度和吞吐率是指的磁盘系统总线上流过的数据量或者网络传输一段时间传输的数据量

响应时间
IO响应时间也被称为IO延时(IO Latency),IO响应时间就是从操作系统内核发出的一个读或者写的IO命令到操作系统内核接收到IO回应的时间。等于IO操作时间和等待时间

IO性能调优

磁盘io调优
磁盘io调优利用内存和批处理,总结起来如下几个方法:

  1. 文件系统缓存
  2. 最小分配
  3. io访问调度
  4. 预读取
  5. 延迟分配

网络io调优
iptraf, tcpdump
1.协议参数调优
2.利用缓存和CDN
3.适用的IO模型

参考
进程、线程、协程之概念理解
关于服务器性能的思考

上一篇 下一篇

猜你喜欢

热点阅读