浅谈如何优化机器人响应速度
最近有很多朋友跟我聊起机器人开发的问题,尤其是在响应速度这一块,我在这里浅谈一下个人看法。关于机器人的响应速度,我认为重点应是网络条件,机器的硬盘读写速度和数据库。网络和硬件无法改变,我们只能针对数据库进行优化。
说说我最近遇到的一个问题
最近更换了服务器商家,之前的机器是美国地区32核心32G,1G宽带。由于商家的问题更换了服务器,更换为64核心64G,10G宽带服务器,本以为机器人的速度会更快,但是在我实际搭建好后发现不仅没有变快,反而更慢了😅。
仔细想想后,我发现核心,内存,带宽的升级其实是对机器人用处不大的,机器人本身的运行只会占用机器不到百M的内存,而1G的带宽更是绰绰有余。那到底是哪里出了问题?
于是我开始对代码debug,定位了许久之后,发现问题出在MySQL模块,更新服务器后,MySQL的查询速度从 ~0.03s 变为了 ~0.1s,这时我意识到可能是硬盘的问题。于是我通过hdparm
工具查询,发现旧服务器的读写速度是新服务器的3倍😄。
说明服务器硬件对机器人的影响还是蛮大的。
软件方面的优化
关于如何优化数据库的查询,最重要的就是索引。索引存在的目的就是为了提升查询数据的效率,对于ORM框架来说索引的使用至关重要,但是ORM的优化往往不能顾及所有业务情况。本机器人没有使用ORM,不再赘述。
索引常用有B+树索引和哈希索引,简单说下区别
B+树索引:类似快表,可以做到模糊查询。B+树索引是传统意义上的索引,是目前关系型数据库系统中查找最为常用和最为有效的索引。B+树索引的构造类似于二叉树,根据键值可以快速找到数据。
Hash索引:哈希索引更适合全值匹配和精确查找,但这个特点对于社工库来说却是致命的,因为社工库往往需要用到 like 语句来对数据库进行模糊查询,所以我们不使用hash索引。
另外就是数据库的引擎,从mysql5.5版本之后,默认引擎变为了innodb。innodb为我们提供了很多的操作,但是社工库只需要查,不需要改,所以用不上事务处理功能,同时,这种操作也会影响效率。所以我们使用myisam引擎,myisam是mysql5.5之前的默认引擎,大家常见的MYD, MYI, frm文件,就是属于myisam的数据文件。myisam小巧轻便,性能极佳,缺点是不支持事务处理,而我们刚好不需要事务处理,所以myisam成为我们最好的选择。
我特意从最坑小白的线下电脑店组装了一台服务器,很老旧,我用这种方法让机器人在破旧的服务器上运行了起来,速度还算不错。由于是本地服务器连接Telegram需要用到代理,代理的延迟无法避免,所以该方法被抛弃。