我有一个数据分析应用程序,它是 CPU 密集型的,每个执行线程产生约 35 MB/s 的数据。
我正在尝试计算出可以同时运行多少个线程,并且能够写入磁盘而不会导致每个线程无休止地等待 I/O。
我发现这个答案关于如何计算写入性能,我已经在我的 2 个本地磁盘(一个 SSD 和 7200 RPM HD)上执行了此操作。
结果是:
固态硬盘:
$ time sh -c "dd if=/dev/zero of=testfile bs=1000k count=1k && sync"
1024+0 records in
1024+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.668421 s, 1.6 GB/s
real 0m3.549s
user 0m0.000s
sys 0m0.456s
同步后,速度为 281 MB/s
高清:
$ time sh -c "dd if=/dev/zero of=testfile bs=1000k count=1k && sync"
1024+0 records in
1024+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 8.79985 s, 119 MB/s
real 0m10.122s
user 0m0.004s
sys 0m0.549s
同步后就是 98 MB/s。
我能得出以下结论吗?
将结果写入SSD:
- 磁盘写入速度达 281 MB/s
- 每个线程产生 35 MB/s
因此,我可以同时运行 8 个线程。(281/35 = 8)
将结果写入硬盘:
- 磁盘写入速度达 98 MB/s
- 每个线程产生 35 MB/s
因此,我可以同时运行 2 个线程。(281/35 = 2.8)
我需要考虑其他因素吗,例如互连速度等?(我的驱动器使用 SATA 3 连接)
如果上述分析正确,我是否可以添加其他驱动器以允许运行更多线程? 如果是这样,它们是否会共享互连,并因此引入上限,如果是这样,我该如何计算?)
答案1
您需要考虑 HDD 的寻道时间。实际上,由于 HDD 必须不断寻道,因此并发写入 HDD 的速度可能会非常慢。
总的来说,用这种方法来估计程序的可能容量是错误的。影响性能的因素太多了,用这种方法可能无法得到任何实际的性能数据。
正确的方法是使用科学的方法,在系统上运行它们,测量性能。如果性能不够高,就把它放在新硬件上,重复这个过程,直到性能足够好。
这问题有关于使用科学方法的更多细节。