自己原文公众号: https://mp.weixin.qq.com/s/xGmMgbTm9D5gsFE1jeTW4g
几天我被问到连接数的问题。一般来说开发都希望设置一个较大的连接数以确保程序不会出问题。
想起我以前经历公司,我有一次模拟并发场景,测试数据库压力。当时我4个会话不停压update和insert的场景。最后结论是每秒处理2000个事务(单机Oracle)没有问题。当时我的领导问,我们有几千个用户,你只模拟4个不合适吧?我回答,请问我们有几千台服务器吗?我们应该只有4个tomcat吧?就算有再多的手机连接最后还是汇聚在4个tomcat上,哪里能有几千个连接?我领导想想说也是。
再说一个案例,我之前做公安行业的,一个城市几百上千个摄像头太正常了。做省级平台的时候就监控设备就快上万了,摄像头要十几万了。很显然我没有上万台服务器,有的只是几台甚至十几台通讯服务器。每个通讯服务器连接几十台到上百台监控设备,不停的采集车辆和人员的数据。也就是说我有上万的设备到了数据中心也就几十台通讯服务器。而每个通讯服务器不停向数据库写入数据。其实每个用一个会话就够了。再加上公安用户使用一个web系统登录。整个数据库活动会话也不超过40个。
那么日常我们为什么大家习惯于设置较大?主要是一个SQL执行不完,又来一个请求,那么这个会话不能复用,所以要再来一个会话,如果密集的话那么就瞬间高了。然后就故障了。
曾经看到一个文章大致是这样的:(网上可以找到)模拟 9600 个并发线程来操作数据库,每两次数据库操作之间 sleep 550ms,
即使是单核 CPU 的计算机也能“同时”运行着数百个线程。但我们其实都知道,这只不过是操作系统快速切换时间片,跟我们玩的一个小把戏罢了。 一核 CPU同一时刻只能执行一个线程,然后操作系统切换上下文,CPU 核心快速调度,执行另一个线程的代码,不停反复,给我们造成了所有进程同时运行假象。
我爸爸就经常说我不要开很多东西,计算机是分时处理系统。
其实,在一核 CPU 的机器上,顺序执行 A 和 B 永远比通过时间分片切换“同时”执行 A 和 B 要快,其中原因,学过操作系统这门课程的童鞋应该很清楚。一旦线程的数量超过了 CPU 核心的数量,再增加线程数系统就只会更慢,而不是更快,因为这里涉及到上下文切换耗费的额外的性能。
所以我们没必要开很多闲置会话,没什么用。redis单线程也很快啊!对不对?
今天先说到这里吧。
