2

我有一个带有for重复约 15k 次的主循环的脚本。在这个循环中,它查询本地 MySQL 数据库并在本地存储库上执行 SVN 更新。我将 SVN 存储库放在 RAMdisk 中,就像以前大部分时间似乎都花在读/写磁盘上一样。

现在我有一个以基本相同速度运行的脚本,但该脚本的 CPU 利用率从未超过 10%。

ProcessExplorer 显示 mysqld 也几乎没有占用任何 CPU 时间或读取/写入大量磁盘。

你会采取什么步骤来找出瓶颈在哪里?

4

3 回答 3

4

在 for 循环中执行 SQL 查询 15k 次是每种语言的瓶颈。

你有什么理由再次查询吗?如果您在 for 循环之前执行单个查询,然后遍历结果集和 SVN 部分,您将看到速度显着提高。

但我怀疑你会得到更高的 CPU 使用率。原因是你不是在做计算,而主要是IO。顺便说一句,您无法在 mysqld cpu 使用情况中衡量这一点,因为它在实际代码中不是查询的复杂性,而是它们的计数和服务器引擎回答的延迟。因此,您只会看到非常短且成本不高的查询,但这些查询确实会及时总结。

于 2010-01-16T08:03:41.147 回答
1

分析您的 Python 代码。这将向您显示每个函数/方法调用需要多长时间。如果这是查询 MySQL 数据库的方法调用,您将知道在哪里查找。但它也可能是别的东西。无论如何,分析是解决此类问题的常用方法。

于 2010-01-16T07:44:00.487 回答
1

可以说,它是“众所周知的”,svn update它在完成运行后等待长达一秒钟,以便文件修改时间戳“过去”(因为许多文件系统的时间戳粒度不小于一秒)。您可以通过谷歌搜索“svn sleep_for_timestamps”找到有关它的更多信息。

I don't have any obvious solution to suggest. If this is really performance critical you could either: 1) not update as often as you are doing 2) try to use a lower-level Subversion API (good luck).

于 2010-01-16T11:16:13.080 回答