在Python和MySQL脚本中查找性能瓶颈
我有一个脚本,里面有一个主要的for
循环,这个循环大约会重复执行15000次。在这个循环中,它会查询本地的MySQL数据库,并对本地的SVN仓库进行更新。我把SVN仓库放在了一个RAM磁盘上,因为之前大部分时间都是在读写磁盘。
现在我有一个脚本,运行速度基本上和之前一样,但这个脚本的CPU使用率从来没有超过10%。
ProcessExplorer显示mysqld几乎没有占用CPU时间,也没有大量读写磁盘。
你会采取什么步骤来找出瓶颈在哪里?
3 个回答
大家都知道,svn update
这个命令在运行完后会等上整整一秒钟,这样文件的修改时间戳就会变成“过去的时间”。这是因为很多文件系统的时间戳精度只有一秒钟。想了解更多信息的话,可以在网上搜索“svn sleep_for_timestamps”。
我没有什么明显的解决办法可以推荐。如果这个问题真的影响到性能,你可以考虑:1)减少更新的频率;2)尝试使用更底层的Subversion API(祝你好运)。
对你的Python代码进行性能分析。这可以让你知道每个函数或方法调用花了多长时间。如果你发现某个方法在查询MySQL数据库时耗时较长,那你就知道该关注哪里了。不过,也有可能是其他地方的问题。总之,进行性能分析是解决这类问题的常用方法。
在每种编程语言中,使用循环执行15000次SQL查询会成为一个瓶颈。
你有没有想过为什么每次都要查询一次呢?如果你在循环之前先执行一次查询,然后再遍历结果和SVN部分,你会发现速度会大幅提升。
不过,我怀疑这样做不会让CPU的使用率提高。原因是你并不是在进行计算,而主要是在进行输入输出操作。顺便提一下,你无法通过mysqld的CPU使用率来衡量这一点,因为这与实际代码有关,而不是查询的复杂性,而是查询的数量和服务器响应的延迟。因此,你只会看到一些非常短的、并不耗费资源的查询,虽然这些查询加起来会花费不少时间。