gpt4 book ai didi

Ruby Redis - 线程性能

转载 作者:可可西里 更新时间:2023-11-01 11:02:14 28 4
gpt4 key购买 nike

我正在使用 Ruby 1.8.7 和 redis-rb gem。我尝试了各种方法将 100 万条记录写入 Redis 列表。

我注意到在使用线程时性能受到影响。这是什么原因,我该如何预防?我将在线程环境中使用 Redis 进行生产,所以我很担心。

这是我的结果:

1_000_000.times do
$r.rpush "test_list", rand(1_000_000)
end
# Took: 74.2986769676208 sec.

threads = []
1_000.times do
threads << Thread.new {
1_000.times {
$r.rpush "test_list", rand(1_000_000)
}
}
end
threads.each { |k| k.join }
# Took: 391.705540895462 sec.

mutex = Mutex.new
threads = []
1_000.times do
threads << Thread.new {
1_000.times {
mutex.synchronize {
$r.rpush "test_list", rand(1_000_000)
}
}
}
end
threads.each { |k| k.join }
# Took: 308.474660873413 sec.

mutex = Mutex.new
threads = []
10.times do
threads << Thread.new {
100_000.times {
mutex.synchronize {
$r.rpush "test_list", rand(1_000_000)
}
}
}
end
threads.each { |k| k.join }
# Took: 109.103996992111 sec.

forks = []
8.times do
forks << fork {
125_000.times {
$r.rpush "test_list", rand(1_000_000)
}
}
end
forks.each { |k| Process.wait(k) }
# Took: 23.7934968471527 sec.

最佳答案

砰!

这是一个很好的例子,因为它展示了很多场景。我们是否应该假设正确数量的条目最终出现在 redis 的“test_list”中,因为我想知道第一个例子......? (在线程加入后查看计数会很有用)

所以,我的解释是:

1 Thread, 1 million writes each

执行时间:74 秒

通过序列化写入到 redis 的单连接

1000 Threads, 100 writes each, no ruby mutex

执行时间:380 秒

我认为我们必须假设 Redis 使用它自己的互斥锁进行写入,因此这里的“开销”将是 Redis 自己的互斥锁的结果。这可能是因为每个线程都共享同一个客户端对象来写入——您是否尝试创建 1000 个 redis 客户端? :)

1000 Threads, 1000 writes each, ruby mutex

执行时间:308 秒

由于 ruby​​ 线程内部的互斥量,Redis 的写入(“设置”)似乎以更有序的方式进行。这里的开销是必须等待 1 个线程写入 Redis 的 999 个线程...

10 Threads, 100,000 writes each, local mutex

执行时间:108 秒

每次等待互斥锁的线程更少,因此写入周期更快。

8 forks, 125,000 writes each

执行时间:23 秒

这里还有一点开销,否则这是 8 个不同的 Redis 连接,每个连接写入 125,000 个键。 Redis 把它搞定了……我认为“开销”是在 ruby​​ 进程的 fork 中(否则你会期待更像 10 秒的时间)

感谢您进行测试 - 它真的很有指导意义,我将把它作为培训练习展示给我们的开发人员!

关于Ruby Redis - 线程性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16561706/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com