Unlocking Ractors: class instance variables in Ruby
a year ago
- #Performance
- #Ruby
- #Ractors
- Ruby中的Ractor适用于将CPU密集型工作移出主线程,但由于Ruby VM的全局锁存在实现缺陷和性能问题。
- 类实例变量和类变量是Ractor的主要争用点,会导致显著的性能下降。
- 基准测试显示,由于VM锁争用,使用Ractor进行并行计算可能比单线程执行慢8倍。
- 次级Ractor可以读取但不能写入类实例变量,且这些值必须是可共享的,以避免隔离错误。
- 提出的减少锁争用的解决方案包括更细粒度的锁、读写锁和使用原子操作的无锁方法。
- Ruby中的实例变量通过形状(shapes)和字段数组管理,复杂形状处理频繁添加或删除实例变量的情况。
- 无锁解决方案将实例变量管理委托给单独的GC托管对象,允许无锁原子更新。
- 这种方法显著提高了性能,在基准测试中使Ractor比单线程执行快近3倍。
- 该解决方案还顺便修复了Ruby新Namespace特性的问题,允许按命名空间管理实例变量。
- 由于malloc的开销与Ruby对象相当,内存使用预计不会显著增加。