当今数字化时代,存储数据的爆炸性增长已经成为一个全球性的挑战。随着人工智能、自动驾驶和大数据等行业的迅猛发展,人工智能算法的训练和推理、自动驾驶车辆的传感器数据、大规模数据分析等,都对存储系统提出了巨大的挑战,对高性能、高可靠和低延迟的存储解决方案的需求变得尤为迫切。在此背景下,焱融科技基于软件定义存储自主研发的文件存储系统 YRCloudFile 为企业提供了一个突破性的存储解决方案。YRCloudFile 不仅以其高性能和可靠性著称,而且能够敏捷地适应不同行业和应用场景的需求,Page Cache 则是实现这一切的关键技术之一。
Page Cache 概念及优势
从字面意义来看,Page Cache 分为 Page 和 Cache 两个词。Page 是 Linux 管理内存的一种方式,直译为页。Linux 把整块内存划分为一个个小的内存块方便管理,而这每块小内存则成为 Page。Cache 则可以直译为缓存。那么 Page Cache 可以直译为页缓存或者内存缓存。Page Cache 是一种 Linux 内核中的机制,在处理存储数据时发挥了重要作用。它将磁盘上的文件数据缓存到内存中,从而实现快速访问和数据读写操作的优化。
现在,想象一下您正在电脑上打开一个文件,在没有 Page Cache 的情况下,每次读取文件都需要直接从硬盘中获取数据,而硬盘的速度是相对较慢的,传统的 hdd 还包括了磁头寻道和旋转的时间。当您首次读取文件时,操作系统会将文件的部分或全部数据存储到 Page Cache 中,类似于计算机的内存,以便下次读取时可以更快地访问。当您再次读取相同的文件时,操作系统首先检查 Page Cache,如果文件的数据已经存在于内存中,就可以直接从内存中获取,而不需要再次访问硬盘。由于内存的读取速度比硬盘快得多,所以这种缓存机制可以大大加快文件的读取速度。
Page Cache 的另一个好处是它能够优化写入操作。当写入文件时,操作系统会将数据首先写入 Page Cache,然后再适时地将数据写入硬盘。这样做的好处是:
- 可以优化用户体验,使用户的写入速度更快。
- 操作系统可以将多个较小的写入请求合并成一个更大的块,从而减少硬盘的随机写入操作,提高写入效率。
Buffered IO 特征浅析
如果使用 Page Cache,那么内核就会首先把数据复制到内核缓冲区,这种方式称为 Bufferd Io。它的工作原理大概可以分为读取磁盘内容到 Page Cache,和下刷 Page Cache 到磁盘两方面。
读取磁盘内容到 Page Cache
- 读取时机:
当应用程序读取一个文件时,操作系统会检查文件是否存在于 Page Cache 中。如果对应文件数据尚未缓存到 Page Cache,操作系统会发起一个磁盘读取请求,将文件的一部分读取到 Page Cache 中后,再将 Page Cache 中的文件内容返回给用户。 - 读取大小:
最大预读大小一般为128 KB,可以通过cat/sys/class/bdi/default/read_ahead_kb
查看和修改。初始读取的大小通常由用户操作和最大预读大小来决定,一般在 max_size/4~max_size 之间。根据不同用户的需求和场景,这个数字可以动态调整。
下刷 Page Cache到磁盘
当应用程序对文件进行写入操作时,数据首先被写入 Page Cache 中,然后 Linux 会把对应的 Page 标记为 dirty,用来识别某个 Page 是否需要下刷。具体来说,有三种策略将 Page Cache 中的数据下刷到磁盘上的对应位置。
- 定期下刷。Linux 存在一个后台线程负责下刷系统内所有的 Page Cache 上的内容到磁盘上。而改线程会默认 5 秒被唤醒一次,来下刷 Page Cache 内所有的内容到磁盘上。
- 内存不足触发内存回收。在内存不足时, Linux 也会主动唤醒后台下刷线程。
- 用户主动触发。用户可以执行 sync 命令,来主动触发 Page Cache 的下刷。
使用缓存提高性能带来的一个副作用就是数据的一致性问题。数据在缓存中时,如果有其他客户端更新了数据,但是本客户端没有感知到,就会继续从缓存中读取数据,导致读到的数据不是最新的数据。YRCloudFile 对这种场景做了优化,支持 close-to-open 语义。具体是说,当本客户端在读取缓存中的数据时,如果有其他客户端更新了数据,那么本客户端不会立即读取到最新的数据,而是等到 close 文件并再次打开文件时,才会读取最新的数据。这也是业界一种常用的一致性语义。
YRCloudFile 在传统的 Page Cache 的功能上还增加了一些特性,比如可以限制用户 Page Cache 的使用量的大小,可以限制用户 Inode Cache 的大小,这样可以更加方便的控制用户的内存使用量,不会由于缓存过多导致内存使用量过大,从而影响到其他应用。
Direct IO 特征浅析
与 Bufferd Io 相对应的,就是 Direct Io。使用 Bufferd Io 就是由内核来管理文件缓存,但有一些应用需要自己来管理文件缓存,比如数据库,所以衍生出了 Direct Io。Direct Io 有以下特点:
- Direct I/O 是一种绕过操作系统缓冲区的数据传输方式,数据直接在应用程序和存储设备之间传输,没有中间的内核缓冲区。
- Direct I/O 对于需要大规模数据传输的应用程序来说效果更好,特别是在高吞吐量、低延迟的需求下,如数据库系统、文件服务器等。
- Direct I/O 可以减少数据复制操作,从而提高性能并减少 CPU 开销。
- 然而,Direct I/O 也有一些限制和注意事项。例如,它要求应用程序对内存进行对齐(aligned)操作,确保数据块大小是设备块大小的整数倍。
- 由于 Direct IO 直接和存储设备直接进行交互,它没有数据的一致性问题,每次读写都可以读到最新的数据。
焱融 YRCloudFile
利用 Page Cache 加速存储读写
焱融高性能分布式文件存储产品 YRCloudFile 利用 Page Cache 的特性,可以高效地缓存和管理热门或频繁访问的文件数据。无论是人工智能算法的推理过程还是自动驾驶车辆的数据传输,都可以通过快速访问 Page Cache 中的数据来提高性能和响应速度。下面是在 YRCloudFile 实测使用 Page Cache 和不使用 Page Cache 的性能差距:
测试使用单 job,采用顺序写的方式
不使用 Page Cache:
[root@node-1 ~]# time dd if=/dev/zero of=/mnt/yrfs/1G bs=1M count=1024 oflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 3.27599 s, 328 MB/s
real 0m3.514s
user 0m0.001s
sys 0m0.266s
使用 Page Cache:
[root@node-1 ~]# time dd if=/dev/zero of=/mnt/yrfs/1G bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.854927 s, 1.3 GB/s
real 0m0.937s
user 0m0.000s
sys 0m0.590s
可以清晰看到,在单线程顺序读写 1G 文件的场景下,使用 Page Cache YRCloudFile 提升了3 倍多的性能。这个差距,会随着并发数量的增加进一步扩大。正是应用了 Page Cache 技术,焱融分布式文件存储 YRCloudFile 能够完美解决人工智能、自动驾驶和大数据等场景下对于高性能、敏捷化和低成本存储解决方案的需求。通过充分利用 Page Cache 的技术优势,YRCloudFile 能够减少磁盘访问次数、提高读取效率、优化写入操作,并与 POSIX 兼容,为企业级用户提供卓越的存储性能。