db性能优化

这篇具有很好参考价值的文章主要介绍了db性能优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、py脚本释放cpu资源,time.sleep(0.001)

python脚本释放cpu资源,time.sleep(0.001)

  1. 原来写了个time.sleep(0.02)。为什么这么写的原因有点不太确定了,回忆了下,大概是一开始是轮询模式,避免tick触发太频繁,所以每20ms判断1次。后面改为阻塞模式,没有去掉这个time.sleep(0.2)。导致执行命令时,总有20多ms的耗时。
  2. 内网是20个服的db布置在同一台物理机上,每个服16条线程,一共300多条线程。如果time.sleep(0.001)很容易就能把cpu干爆(100%)。并且有的线程一直持有cpu,有的线程一直抢不到cpu资源。就会发现有的人访问db很快,有的人访问db就很慢。
  3. 2023-09-28 后来发现,前面的结论不完全准确。time.sleep(0.001)已经交出cpu时间片了。原则上运行的dbpy的cpu使用率应该很低。实际上没有业务的时候,确实只占用2~3%的使用率。但是内网有17个db布置在同一台机器上。db数量 * 服务数量 * cpu使用率= 17*2*2.5 = 85,也就是空转的时候,已经吃掉了85%的cpu。内网是双核的机器,相当于有200%cpu,85/200=0.425,差不多就是mobaXterm显示的值。
  4. 2023-09-28 这里犯了一个很傻逼的错误,不断的调整sleep的时长。其实并没有什么意思。sleep(0.001)已经交出cpu时间片了。如果cpu使用率还很高的话,那么说明业务逻辑占用了太高的cpu。需要去优化业务逻辑,调整sleep并没有实际解决问题。
    把sleep从0.02修改为0.001,cpu使用率当然会下降。那是因为业务逻辑函数被触发的次数下降了。但是要维持tps的话,业务逻辑函数不能下降调用次数。
import time
def Work():
	a = 1
    while a < 0xFFFF:
    #while a < 0xFFFFFF:
        a += 1

def Main():
	Work()
	time.sleep(0.02)
	#time.sleep(0.1)

二、time.sleep()精度问题

在windows中,time.sleep(0.001)并不能实现让线程睡眠1毫秒,因为操作系统的精度问题,其睡眠时长大概在16ms左右。得使用time.perf_counter()函数。

lastTime = time.perf_counter()
while True:
	nowTime = time.perf_counter()
	if nowTime - lastTime >= 0.001:
		# 执行函数
		Func)()
		lastTime = time.perf_counter()

精度问题2

time.perf_counter()这个函数好像也不太好用。换了一种思路去解决。
用py写了一个测试脚本,在循环里面insert log到mysql,大概每秒能插入8000条log。但是在storage_py里,每秒只能处理100条左右,差了整整80倍。

  1. 后来排查,发现生产线程redis队列中取请求req的速度就很慢,1秒钟就只blpop出100个左右。最后判断是time.sleep(0.001)使用不恰当,这里以为1秒能取出1000个请求。但由于time.sleep(0.001)实际上睡眠16ms左右,所以取出的请求数量大概是1000/16=62。
    解决方案是:sleep一次以后,加个计数一直blpop取,取够200个命令,才进入下一次sleep。
    2023-09-28:订正一下,这里为啥要加计数呢?计数其实并不合适。这里应该直接用阻塞,当请求队列中有请求的时候,应该一直取,知道队列取完了,那么退出业务逻辑。执行1次sleep(0.001)。嗯这样改完以后,速度提升显著。

  2. 同样的,在消费线程处理req的时候,发现也是16ms才处理一条,王德发。于是也改成,sleep一次以后,就处理够200个,才进入下次sleep。(2023-09-28 注:这里也改成阻塞了)

三、insert数据有点慢,表的主键、索引、自动递增

  1. insert数据有点慢,表的主键、索引、自动递增
    插入战报、log的操作有点慢。

四、 dbsdk读取resp有点慢,因为互斥锁lock太多代码了

dbsdk读取resp有点慢,因为互斥锁lock太多代码了

  1. 锁越多的代码,锁住的时间就越久。其它线程等待的时间也越长。所以在实现功能的情况下,锁越少的代码越好。
  2. 双缓存队列,只在交换的时候,锁一下,其它时候,2个线程只访问当前持有的队列。

五、关闭auto commit

mysql的auto commit是默认是打开的
pymysql多次execute(),一次commit()
定义了个遍历,每累计执行execute()1000个命令,就commit()提交1次。

  1. 提升蛮多的,但是要注意如果在commit之前出错了,要捕获异常,在处理异常中,执行commit(),否则会出现命令未提交的现象。
  2. 遇到个问题,有些命令是需要立即写数据库的。比如创建角色,在insert插入角色之后,会从数据库select查询角色数据。此时因为还没有累计达到1000个命令,所以数据库里并没有角色数据。没有角色数据,就被认定为新角色。这样上层逻辑就不对了。用数量来控制是否commit()会有问题
    换了种方法,记录上次提交的时间戳,用时间来控制是否commit(),测试下来目前好像没什么问题。
    解决方案:数量控制+时间控制。

log类的request命令,可以用合并提交的方式来优化。

六、不设置cb回调函数

game内存容易增长,因为所有命令都要等python执行完毕,然后才释放内存。但有一些命令,可以不需要回调,因为回调也不会做什么操作。例如:log命令、操作缓存类的命令文章来源地址https://www.toymoban.com/news/detail-513654.html

七、其它

  • __forceinline加在模板函数前,声明为内联模板函数。
  • 尽量避免字符串的构造和析构。比如参数要求string,传递参数本身已经是string,不要再使用str.c_str()。

到了这里,关于db性能优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Go面试向】defer与time.sleep初探

    大家好 我是寸铁👊 总结了一篇defer传参与time.sleep初探的文章✨ 喜欢的小伙伴可以点点关注 💝 请大家看下面这段代码,看运行结果会出现什么,为什么? demo 这里不少同学会认为:这题我会,先输出 函数结束 ,待整个函数结束后,根据 defer后进先出 的顺序依次打印计算的

    2024年01月25日
    浏览(34)
  • chatGPT给出Python time.sleep()假死(挂起)的解决办法

    最近,使用chatGPT帮着写程序,完成通过API获取天气数据的程序,运行起来后出现了状况:莫名其妙的的假死(程序被挂起来,不执行了),而且在Linux环境中更容易挂起。 程序详见作者的博文” 使用chatGPT开发获取格点天气数据“。 起初,我的目的是开发个近期使用,临时获

    2024年02月06日
    浏览(41)
  • unity 性能优化之GPU和资源优化

    众所周知,我们在unity里编写Shader使用的HLSL/CG都是高级语言,这是为了可以书写一套Shader兼容多个平台,在unity打包的时候,它会编译成对应平台可以运行的指令,而变体则是,根据宏生成的,而打包运行时,GPU会根据你设置的宏切换这些打包出来的代码,而不是我们书写那

    2024年02月02日
    浏览(60)
  • [SSD NAND 7.1] 闪存系统性能优化方向集锦?AC timing? Cache? 多路并发?

    传送门    总目录 主页 : 元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 1. 优化 AC Timing,提升总线频率 1.1 优化 AC Timing 1.2 优化总线频率 2. 使用 Cache Read/Program 3. 多路并发技术 3.1 多平面(Multi Plane)操

    2024年02月04日
    浏览(79)
  • [深入理解NAND Flash (指令篇) ] 闪存系统性能优化方向集锦?AC timing? Cache? 多路并发?

    传送门    总目录 主页 : 元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 1. 优化 AC Timing,提升总线频率 1.1 优化 AC Timing 1.2 优化总线频率 2. 使用 Cache Read/Program 3. 多路并发技术 3.1 多平面(Multi Plane)操

    2024年02月14日
    浏览(51)
  • Unity 之 一些资源标准、性能优化点整合整理

    目录 Unity 之 一些资源标准、性能优化点整合整理 零、总起 一、模型 二、图片 三、音频资源 四、灯光 五、碰撞体 六、font 七、UGUI 八、移动端性能优化心得 优化思路: 1)和美术指定好相关资源的规范 2)代码框架,合理的管理资源、多线程使用、对象池的使用、算法的优

    2024年02月05日
    浏览(43)
  • Rust 性能优化 : Rust 性能优化技巧,提升 Rust 程序的执行效率和资源利用率 The Rust Performance

    作者:禅与计算机程序设计艺术 在过去的几年中,随着编程语言的快速发展,编程人员已经逐渐从依赖编译型语言转向了使用解释型语言。相对于编译型语言来说,解释型语言具有更快的执行速度,在某些情况下甚至可以实现接近编译器的运行时效率。但是另一方面,这些语

    2024年02月07日
    浏览(98)
  • Unity 性能优化四:UI耗时函数、资源加载、卸载API

    1.1 Canvas.SendWillRenderCanvases 这个函数是由于自身UI的更新,产生的耗时 1. 这里更新的是vertex 属性,比如 color、tangent、position、uv,修改recttransform的position、scale,rotation并不会导致顶点属性改变,因为顶点的position是根据pivot的偏移决定的,而改变其size、pivot、anchor,则会修改

    2024年02月14日
    浏览(46)
  • nginx上web服务的基本安全优化、服务性能优化、访问日志优化、目录资源优化和防盗链配置简介

    目录 一.基本安全优化 1.隐藏nginx软件版本信息 2.更改源码来隐藏软件名和版本 (1)修改第一个文件(核心头文件),在nginx安装目录下找到这个文件并修改 (2)第二个文件 (3)第三个文件,内置响应信息页面 (4)第四个文件 (5)重新编译安装并重启 3.更改nginx服务的默

    2024年02月13日
    浏览(45)
  • Spark性能优化:提高计算速度与资源利用率的实用技巧

    Apache Spark是一个开源的大规模数据处理框架,它可以处理批量数据和流式数据,并提供了一个易用的编程模型。Spark的核心组件是Spark引擎,它负责执行用户的计算任务。在大规模数据处理中,Spark性能优化是非常重要的,因为它可以提高计算速度和资源利用率。 在本文中,我

    2024年02月20日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包