webman如何实现同时处理多个耗时数据库查询业务?

凭栏知潇雨

很多时候有些SQL查询比较耗时,假如用SLEEP(1)模拟,webman的数据库是单例的,PDO也是阻塞的,在当前进程内只能同时有一个请求在执行,如果开启4个进程,并发查询20次,那么所有请求完成至少需要5秒钟,如何能做到所有结果1秒钟返回?

2265 2 2
2个回答

2548a

进程数设置原则
1、每个进程占用内存之和需要小于总内存(一般来说每个业务进程占用内存大概40M左右)

2、如果是IO密集型,也就是业务中涉及到一些阻塞式IO,比如一般的访问Mysql、Redis等存储都是阻塞式访问的,进程数可以开大一些,如配置成CPU核数的3倍。如果业务中涉及的阻塞等待很多,可以再适当加大进程数,例如CPU核数的5倍甚至更高。注意非阻塞式IO属于CPU密集型,而不属于IO密集型。

3、如果是CPU密集型,也就是业务中没有阻塞式IO开销,例如使用异步IO读取网络资源,进程不会被业务代码阻塞的情况下,可以把进程数设置成和CPU核数一样

这种我一般会直接拆分出来,图方便就直接加大进程数咯.

  • 凭栏知潇雨 2022-01-25

    一直加进程也不是办法, 可能还是要优化下SQL,加点缓存啥的

walkor 打赏

这种瓶颈在数据库,最简单的方案是多开进程。
数据库连接数是有限的,这种1秒的慢sql,要把数据库连接数用满才能达到最大QPS。比如数据库最大连接数200,那么极限就是200 QPS,如果是一个请求里有几个慢SQL,那极限QPS也就几十个,不管你上多进程 多线程还是协程 异步非阻塞都一样。
还有慢sql很耗费性能,几个慢sql就可能就可能导致mysql cpu100%(当然sleep这种除外)。
有慢sql这种最根本的解决办法是优化sql,或者使用缓存等方案避免频繁读写数据库。

年代过于久远,无法发表回答
×
🔝