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

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

进程:

进程是系统资源分配和调度的基本单位,是线程的容器,对于linux系统来说用PID来标识进程。

进程拥有自己的资源,它有自己的地址空间,会包括代码,数据,堆栈段(代码段存储处理器执行的代码,数据段存储变量和进程执行期间使用动态分配的内存,堆栈段存储活动过程中调用的指令和本地变量)

afb3238332c0

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模型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python进程线程协程是实现并发编程的不同方式。 1. 进程(Process)是操作系统分配资源的基本单位,每个进程有独立的内存空间,互不干扰。进程之间的通信需要使用特定的机制,如管道、消息队列等。在Python,可以使用`multiprocessing`模块创建和管理进程。 2. 线程(Thread)是进程内的独立执行流,一个进程可以包含多个线程,它们共享相同的内存空间。线程之间的通信比进程更方便,可以使用共享内存或者全局变量。然而,由于全局解释器锁(GIL)的存在,同一时间只有一个线程在执行Python字节码,因此多线程在CPU密集型任务并不能提高性能。但是对于I/O密集型任务,多线程可以提升效率。Python内置的`threading`模块提供了对线程的支持。 3. 协程(Coroutine)是一种轻量级的线程,由程序控制在特定位置进行挂起和恢复的并发执行。协程能够在执行过程被暂停和继续,并且可以通过yield语句进行交互式通信。Python协程通过生成器函数(generator function)和`asyncio`库来实现。 总结一下: - 进程是资源分配的基本单位,进程之间资源独立,通信复杂。 - 线程进程内的执行流,共享内存,通信相对方便,但受到GIL的限制。 - 协程是一种轻量级的线程,可以在特定位置挂起和恢复执行,并通过yield语句进行通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值