背景
go比php可支持的并发数更高,为什么
目标
分析点:
- 系统的并发瓶颈
- go语言的并发瓶颈
- php语言的并发瓶颈
系统并发
参考:https://juejin.cn/post/6844904025553534990
- 提到并发,我们这里指的是web服务
- web系统的第一层,是nginx
- web系统的并发瓶颈一般在DB上
go和php并发对比
- 语言
- go是编译性,直接生成可执行的字节码
- php是解释性,执行时需要动态解析
- fpm可以设置缓存解析后的字节码
- 线程与协程
- fpm是多进程单线程
- 参考:https://www.jianshu.com/p/3b7aed0a800d
- 子进程需要资源多
- go是利用协程提高并发
- GPM中,P是线程级别的,P调用G,G是协程级别的
- fpm是多进程单线程
- 切换
- fpm单进程阻塞之后,内核会去处理其他的,这里是进程切换
- go的goroutine阻塞之后,P会取寻找其他G来执行,一般不会发生线程切换
- 内存
- 一个php-fpm进程占20M
- go的协程内存是kb级别的
记忆点:fpm进程和gorotine协程,资源消耗、切换、阻塞情况
附录
fpm
参考:https://www.php.cn/php-weizijiaocheng-455614.html
- php+nginx工作流程
- nginx接到请求
- nginx转发给php
- php的fastcgi的master收到请求
- cgi只有一个php进程,它读取php.ini的配置,启动,并服务
- fastcgi
- 有多个进程,master进程读取配置,启动,后续的worker进程无需再次读取配置
- master把请求给worker进程
- worker进程服务
- nginx并返回
- fpm是用来管理fastcgi的进程的