Rails耙平行化阈值和警告

时间:2014-04-18 14:30:02

标签: ruby-on-rails postgresql activerecord parallel-processing rake

这是我第一次遇到有关我必须解决的任务的时间问题。我需要进行大约7M记录的计算(针对web服务运行)。这将花费超过180小时,所以我考虑在EC2上运行多个web服务实例,并且只是并行运行rake任务。

由于我以前从未这样做过,所以我想知道需要考虑什么。 更确切地说:

  • 我可以运行的最大佣金任务数量(有没有限制 除了你自己的机器电源之外?)
  • 与postgres 9.3的最大并发连接数是多少 D b?
  • 运行多个时是否有任何需要考虑的事项 active_record.save同时执行哪些操作?

我期待着听到你的想法。 最好, 菲尔

1 个答案:

答案 0 :(得分:1)

rake个实例

  • 每次运行rake时,您都在运行ruby服务器的新实例,其中包含所有相关内存和相关的负载依赖用法。在你的Rakefile中查找inits。
    • 受内存和CPU使用限制的实例数
    • 您必须分析每个内存和CPU以了解可以运行的内容
    • 您可以编写一个程序来监控和计算可能的内容,但启发式方法可以更好地用于一次性和首次实验。

数据存储

  • 启发式地探索您的数据库容量。
    • 注意创建阻塞的写锁
    • 注意因缺少索引而导致读取速度缓慢
    • 查看你的postgres配置以查看并发限制,缓存大小等。

.save

  • 每个rake任务都是自己的ruby服务器,因此多个active_record.save操作会影响:
    • 由于写锁定而阻塞/等待
    • 获取在另一个更新.save
    • 之前读取的“旧”数据的一个实例

运营复杂性

  • 记录数(7MM)只是每条记录上发生的所有操作的乘数。操作复杂性是限制的来源,因为从理论上讲,运行7MM工人将在最小时间尺度内解决问题
  • 如果180小时准确(可疑),则每个过程(180 * 60 * 60 * 1000) / 7000000 == 92.57 ms
  • 查找任何IO阻止程序的共享资源。
  • 查找您可以提前做的任何常见计算并缓存。查找胜过计算。

勘误表

  • 为基本操作系统进程留出空间。这些因您的环境而异,但您提到AWS但最好从概念上学习如何监控任何系统的活动
    1. 在耙子正在运行时,在单独的屏幕/终端中运行top
    2. 喜欢在不同的屏幕上运行2个顶部。按内存排序1,按CPU排序另一个
    3. 有办法监控耙子
    4. 关注导致top进程冒泡的事件。
    5. 如果你做得这么久/已经足够好了,你已经把你的头部空间描述了
  • 跑更多的耙子来填补你的空间
  • 不要超出你的记忆,否则你会得到swapping

你可能想要考虑beanstalk,但我猜你会发现比学习所有这些好基础更复杂,首先。