我有一个脚本,它有一个重复大约15k次的主for循环。在此循环中,它查询本地MySQL数据库并在本地存储库上执行SVN更新。我将SVN存储库放在RAMdisk中,就像以前一样,大部分时间似乎都花在读/写磁盘上。
现在我有了一个运行速度基本相同的脚本,但该脚本的CPU利用率从未超过10%。
ProcessExplorer显示,mysqld几乎不占用任何CPU时间,也不会对磁盘进行大量读/写操作。
您将采取哪些步骤来找出瓶颈所在?
发布于 2010-01-16 16:03:41
在for循环中执行SQL查询15k次是每种语言的瓶颈。
有什么原因让你每次都要查询吗?如果在for循环之前执行一次查询,然后循环遍历结果集和SVN部分,您将看到速度显著提高。
但我怀疑你会得到更高的CPU使用率。原因是您不是在做计算,而是主要做IO。顺便说一句,您不能在mysqld cpu使用率中衡量这一点,因为它在实际代码中,而不是查询的复杂性,而是它们的计数和服务器引擎响应的延迟。因此,您将只看到非常短的、不昂贵的查询,尽管这些查询确实在时间上进行了总结。
发布于 2010-01-16 15:44:00
分析您的Python代码。这将向您显示每个函数/方法调用所需的时间。如果这就是查询MySQL数据库的方法调用,那么您就有了查找的线索。但它也可能是其他的东西。在任何情况下,分析都是解决此类问题的常用方法。
发布于 2010-01-16 19:16:13
可以说,“众所周知”,svn update在完成运行后等待了整整一秒,因此文件修改时间戳变成了“过去”(因为许多文件系统的时间戳粒度都不会小于一秒)。你可以通过谷歌搜索"svn sleep_for_timestamps“找到更多关于它的信息。
我没有任何明显的解决方案可以建议。如果这真的是性能关键型的,你可以选择: 1)不要像现在这样频繁更新,2)尝试使用较低级别的Subversion API (祝你好运)。
https://stackoverflow.com/questions/2076582
复制相似问题