Ruby VM并发性和并行性

eki*_*eki 1 ruby parallel-processing concurrency scalability multiprocessing

我有一个关于Ruby VM(Ruby解释器)的一般问题.它如何与多处理器一起使用?关于Ruby中的并行性和并发性,假设我有4个处理器.VM是否会通过内核自动为处理器分配任务?通过扩展,可以说我的ruby进程占用了大量的CPU资源; 如果添加新处理器会发生什么?OS是否负责将任务分配给处理器,或者每个VM是否在一个处理器上运行?扩展我的ruby应用程序的最佳方法是什么?我尽可能地分离我的进程并使用amqp队列.还有其他想法吗?

如果你能给我链接以获得更多解释,那就太好了.

提前致谢.

Nic*_*ick 6

Ruby线程

Ruby语言本身通过线程模型支持并行执行; 但是,实现决定了是否使用了额外的硬件资源."黄金标准"解释器(MRI Ruby)在1.8中使用"绿色线程"模型; 线程在解释器中完成,仅使用单个系统线程执行.但是,其他人(例如JRuby)利用Java VM创建实际的系统级线程以供执行.MRI Ruby 1.9增加了额外的线程功能但是(afaik)它仍然仅限于在线程在I/O事件上停顿时切换线程上下文.

高级线程

通常,OS管理线程到逻辑核心的分配,因为大多数应用软件实际上并不关心.在某些高性能计算案例中,该软件将专门请求某些线程在特定逻辑内核上执行,以实现体系结构特定性能.用Ruby编写的任何东西都不太可能属于这一类.

重构

每个应用程序性能限制通常可以通过首先重构代码来解决.利用更适合特定问题的语言或其他环境可能是最好的第一步,而不是立即跳转到现有实现中的线程.

我曾经在Ruby on Rails应用程序上工作,当数据上传时,它有一个大规模的哈希映射函数步骤.最初的实现完全是用Ruby编写的,需要大约80秒才能完成.重写ANSI C中的代码并利用更具体的内存分配,执行时间降至不到一秒(甚至没有使用线程).下一个瓶颈是将大量数据插回到MySQL中,最终还将其移出Ruby代码并转换为线程化C代码.我特意选择了这条路线,因为MRI Ruby解释器很容易绑定到C代码.最后的结果是Ruby为C代码准备了环境,在带有参数的类上调用它作为Ruby实例方法,通过单个C代码线程进行哈希映射,最后用生成和执行插入的OpenMP工作队列模型完成进入MySQL.