为什么要用企业级SSD
为什么我的电脑SSD吞吐500MB,但组成了ceph集群后3快盘的性能还不如一块普通的HDD性能高呢?
究其原因可能要从几个方面进行分析
- 磁盘的种类
企业级磁盘通常采用更耐用的材料,例如高质量的硅片和更好的制造工艺,以减少故障率并提高磁盘寿命。此外,企业级磁盘通常具有更高的读取和写入速度,以及更高的数据传输速率,这些都是企业级应用所需要的。消费级磁盘虽然价格更便宜,但在长期使用过程中会出现更多的问题,例如数据损坏和损坏率更高等问题。企业级磁盘有电容,能避免断电造成的数据损失。这种特殊的电容技术可以在断电时维持电荷,让磁盘有足够的时间将数据缓存到非易失性存储器(NVRAM)中。这样一来,即使断电,数据也不会丢失或受损。事实上,企业级磁盘也常常具有更高的数据重写率,高速缓存,自我修复和其他额外的功能,以确保数据的完整性和可靠性。 - 网络的延迟
普通光纤网络通常具有很高的传输速度,但是存在着一定的延迟问题。这种延迟是由于光信号在光纤中传输的时间和光纤的长度、光电转换,信号处理等因素所造成的。普通光纤网络的延迟通常不会太高,但相对于固态存储设备一个IO操作通常只需要几个微秒(usec)的时间。而1毫秒的延迟已经算是比较长的时间了。这就意味着,如果在存储数据同步过程中出现1毫秒的延迟,它可能会严重影响分部署存储的速度。
Ceph是一个分布式对象存储系统,可以在多个节点上存储和访问数据。在一个Ceph集群中,通过monitor获取集群map,然后将对象写入集群。Ceph使用CRUSH算法来选择OSD,它是一种分布式数据放置算法,可以将数据放置在集群中的多个OSD上,并确保数据冗余和高可用性。CRUSH算法可以根据多个因素来选择OSD,例如硬件配置、网络拓扑结构和数据中心位置等。它使用一种名为CRUSH Map的数据结构来描述Ceph集群中OSD的物理拓扑和数据放置策略。CRUSH Map是一种类似于树状结构的数据结构,它包含了所有OSD的位置信息和层次结构,以及数据放置的规则和权重。当Ceph需要将数据存储到OSD时,它会使用CRUSH算法来计算出最佳的OSD位置,并将数据存储到该位置。这样实现数据的冗余和高可用性。因此,CRUSH算法是Ceph实现高可用性和容错性的核心算法之一。
一个IO的时间:两次写入和两次ACK时间
为什么是两次? 当第一次写入完成后,2,3两次是同步发生的,如果同类磁盘同样网络,用时应该一致。
我们的网络延迟在1ms左右,平均大致在750ms。 (按单次ACK通信1ms算,三块OSD一次IO至少需要2ms,得出如果单任务情况下最高IOPS 为500)
如何提速呢? 硬盘处理多任务;多OSD同时工作
10次IO的时间:?
100次IO的时间: ?
10万次IO的时间: ?
先往下看硬盘IO速度
其中2,3可以是同步进行的,但是,1,4,5网络传输时常必须算进去。 如果网络传输为1ms,磁盘再快也至少需要2ms时间进行一个IO。 由此计算3osd的理想IOPS为每秒500个。
那么再研究研究一块磁盘,一个IO请求到底有多快呢?
使用 fio
命令测试磁盘性能
fio --direct=1 --sync=1 --rw=write --bs=4k --numjobs=1 --iodepth=1 --runtime=60 --time_based --group_reporting --name=journal-test --filename=/dev/sda
-filename
: device we want to test-direct
: we open the device withO_DIRECT
which means that we are bypassing the Kernel page cache-sync
: we open the device withO_DSYNC
we don’t acknowledge until we are sure that the IO has been completely written-rw
: IO pattern, here we usewrite
for sequential writes, journal writes are always sequential-bs
: block size, here we are submitting 4K IOs, this is probably the worst case scenario, so you can always change this value if you know your workload-numjobs
: number of threads that will be running, think this hasceph-osd
daemons writing to the journal-iodepth
: we are submitting IO one by one.-runtime
: job duration in seconds-time_based
: run for the specified runtime duration even if the files are completely read or written-group_reporting
: If set, display per-group reports instead of per-job when numjobs is specified.-name
: name of the run
If for whatever reasons fio
is not available, here is the dd
way:
$ sudo dd if=/dev/urandom of=randfile bs=1M count=1024 && sync
$ sudo dd if=randfile of=/dev/sda bs=4k count=100000 oflag=direct,dsync