【问题标题】:reducing I/O on application and database减少应用程序和数据库的 I/O
【发布时间】:2011-07-22 11:16:22
【问题描述】:

有没有办法减少与 mysql 或 python 脚本相关的 I/O?我正在考虑使用 EC2,成本似乎还可以,但我无法真正预测我的 I/O 使用情况,而且我担心它可能会因成本而使我措手不及。

我基本上开发了一个python脚本来解析数据并将其上传到mysql。一旦它在 mysql 中,我会对其进行一些相当繁重的分析(创建新列、表......基本上是对大型数据集进行大量基于数学和财务的分析)。那么是否有任何设计最佳实践来避免繁重的 I/O?我认为 memcached 将所有内容存储在内存中并从那里访问它,有没有办法让 mysql 或其他脚本做同样的事情?

我现在在另一个有 2 gigs ram 的主机上运行脚本很好,但是我正在查看的 ec2 实例有大约 8 gigs,所以我想知道是否可以使用额外的内存来节省一些钱。

【问题讨论】:

  • 您的大型数据集有多大?它是否适合内存?
  • 嗨,克里斯..是的,我应该提到它应该适合。我的计划是我的数据集可能是 2-3 场演出,而盒子上实际上没有其他东西在运行。如果有可行的解决方案,我真的可以不断升级我的内存以跟上。

标签: python mysql amazon-ec2 mysql-management


【解决方案1】:

我假设您的 IO 是指磁盘 IO...并假设您可以轻松将所有内容放入内存中。你可以:

  • 在您的盒子上禁用交换†
  • 在处理时使用 mysql MEMORY 表,(或者如果您只是为了方便 SQL 查询而使用数据库,则可以考虑在内存存储中使用 Sqlite3

另外:除非您使用 EBS,否则我认为 Amazon 不会对您的实例上的 IO 收费。 EBS 比您的实例存储慢得多,因此仅在您需要持久性时使用它,即。不是在你处理数据的时候。

†可能是个坏主意

【讨论】:

  • 我怀疑禁用交换会减少磁盘 I/O ...虽然这可能取决于您的操作系统...但不依赖于您的操作系统的是禁用交换意味着您的应用程序将 当你用完内存时崩溃 ...恕我直言,这不是一个好主意...如果您的系统使用大量交换空间,请添加更多内存。或者添加更快的(SSD)交换......但不要禁用它,它的存在是有原因的;-)
  • 崩溃并没有错!我只是想发挥最大的作用...仅第二点就足够了。
【解决方案2】:

您并没有真正指定它是写入还是读取。我的猜测是,您可以在 ramdisc 中的 mysql 实例中完成所有操作(Linux 下的 tmpfs)。

ALTER TABLE 和复制大数据等操作最终会创建大量 IO 请求,因为它们会移动大量数据。这与您刚刚获得大量随机(或更可预测的查询)不同。

如果是批处理操作,也许您可​​以完全在 tmpfs 实例中完成。

可以在机器上运行多个 mysql 实例,在 tmpfs 上启动一个实例非常容易 - 只需在 tmpfs 中使用带有 datadir 的 mysql_install_db,然后使用适当的参数运行 mysqld。将其粘贴在一些 shell 脚本中,您将启动它。因为它在 ramfs 中,所以它不需要为它的缓冲区使用太多内存 - 只需将它们设置得相当小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2011-03-08
    相关资源
    最近更新 更多