最近在做一个系统优化的项目,经排查发现程序存在大量数据库操作并且是同步的,导致性能急剧下降。因相关数据库操作对实时性要求不是很强,所以打算部署一个数据库操作模块,负责异步化系统所有数据库操作请求。
下面是项目一些注意点的简单总结。
-
当只有一个线程抢占锁时,加解锁的性能开销可以忽略不计(不精确)。
-
当操作网络IO(如tcp一发一收的情况),会消耗10ms以上,qps为6000个请求每分钟,性能急剧下降(不精确)。
-
数据库对同一个表做插入操作时可适当的合并(如insert into XXX values(),(),(),(),()…),数据库单表一次insert操作大概消耗300微妙(不精确)。
-
请求超时时间要设置合理,避免同步等待过长时间(最好异步化)。
-
协议制定要有可扩展,兼容新旧版本(如带版本号)。
-
buf分配及大小关系(静态变量注意多线程加锁问题,栈变量注意大小问题,堆变量注意内存泄露问题)。
-
cpu密集型注意适当sleep让出cpu。
-
容灾方案要考虑好,做到多机部署,故障时自动切换逻辑(如回包统计、超时换侧等)。
-
适当打印日志,合理调整日志级别。
-
充分检测异常条件,及时告警,做好保护。
-
对于小包,可以采取攒包策略,减少网络io次数。tcp也可使用长连接,减少握手消耗。
-
CPU线程或主线程和IO线程如无需同步操作可以通过队列通信,实现异步化。
-
队列大小设置得当,起到缓冲作用。
-
部署规范化(如接入公司相关发布系统等)。
-
增加灰度逻辑,必要时设置动态开关,及时回退老逻辑。