7

索引构建磁盘IO太高,巧用tmpfs让内存来帮忙 - JadePeng

 7 months ago
source link: https://www.cnblogs.com/xiaoqi/p/18009519/tmpfs
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在文本索引构建这种需要大量占用磁盘IO的任务,如果正巧你的内存还有点余粮,是否可以先索引存储到内存,然后再顺序写入到磁盘呢?,需要大量占用磁盘IO,如果正巧你的内存还有点余粮,是否可以先索引存储到内存,然后再顺序写入到磁盘呢?

38465-20240206121632755-2125001048.png

将Linux的内存变为磁盘,可以通过tmpfs文件系统实现。

tmpfs介绍#

以下是ChatGPT的介绍:

tmpfs文件系统是Linux内核自带的一种内存文件系统,它可以将内存空间作为虚拟磁盘使用。使用tmpfs文件系统将内存变为磁盘,可以通过以下步骤实现:

创建一个tmpfs文件系统:

sudo mkfs.tmpfs -m 100M -o size=100M /dev/shm/mydisk  

这条命令将在/dev/shm/mydisk设备上创建一个大小为100MB的tmpfs文件系统。

挂载tmpfs文件系统:

sudo mount -t tmpfs /dev/shm/mydisk /mnt/mydisk  

这条命令将/dev/shm/mydisk设备上的tmpfs文件系统挂载到/mnt/mydisk目录。

此时,/mnt/mydisk目录就可以像普通磁盘一样使用了。可以将文件写入到该目录,也可以从该目录读取文件。

docker使用tmpfs#

在docker容器环境如何使用呢?是否需要在container里去挂载?

其实在docker里,tmpfs是默认支持的,可以通过 在启动命令里,加上类似--mount type=tmpfs,destination=/mnt/tmpfs,tmpfs-mode=1770,tmpfs-size=12G来实现挂载。

注意tmpfs挂载的,是container容器独享的,不能和其他容器共享,有效期就是容器的生命周期。

我们来实验:

[root@dev ~]#docker run -it --rm --mount type=tmpfs,destination=/mnt/tmpfs,tmpfs-mode=1770,tmpfs-size=12G gcc:12 bash
root@87b86fe9a4d0:/# df -h 
Filesystem      Size  Used Avail Use% Mounted on
overlay         182G  160G   13G  93% /
tmpfs            64M     0   64M   0% /dev
tmpfs            63G     0   63G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sda2       182G  160G   13G  93% /etc/hosts
tmpfs            12G     0   12G   0% /mnt/tmpfs
tmpfs            63G     0   63G   0% /proc/acpi
tmpfs            63G     0   63G   0% /proc/scsi
tmpfs            63G     0   63G   0% /sys/firmware
  • 首先通过docker run 挂载,制定大小12G
  • 在容器里,通过df -h 可以看到挂载的/mnt/tmpfs 类型为tmpfs,大小12G

K8S 使用tmpfs#

在K8S里,tmpfs对应的是 emptyDir Volume,将emptyDir.medium 指定为Memory,可以让 Kubernetes 挂载 tmpfs(基于 RAM 的文件系统)。

emptyDir 的一些用途:

  • 缓存空间,例如基于磁盘的归并排序。
  • 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
  • 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。

emptyDir 配置示例#

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: registry.k8s.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      sizeLimit: 500Mi
      medium: Memory

Spark on k8s#

对于运行在K8S上的spark,也可以通过volumes参数来指定使用tmpfs。

spark提供下面几种类型的volume

  • hostPath: mounts a file or directory from the host node’s filesystem into a pod.
  • emptyDir: an initially empty volume created when a pod is assigned to a node.
  • nfs: mounts an existing NFS(Network File System) into a pod.
  • persistentVolumeClaim: mounts a PersistentVolume into a pod.

可以通过下面的参数来配置Volume:

--conf spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].mount.path=<mount path>
--conf spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].mount.readOnly=<true|false>
--conf spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].mount.subPath=<mount subPath>

对于VolumeType的配置,可以通过下面的形式来做:

spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].options.[OptionName]=<value>

因此,spark on k8s支持tmpfs, 假设VolumeNamespark-empty-dir, 挂载路径/mnt/cache-index, 大小限制12G,那么提供任务时可以指定参数:

--conf spark.kubernetes.executor.volumes.emptyDir.spark-empty-dir.mount.path=/mnt/cache-index
--conf spark.kubernetes.executor.volumes.emptyDir.spark-empty-dir.options.medium=Memory
--conf spark.kubernetes.executor.volumes.emptyDir.spark-empty-dir.options.sizeLimit=12G

优化后,文本索引构建时IO占用:

38465-20240206121641871-1083516261.png

欢迎关注作者微信公众号, 一起交流软件开发:

欢迎关注作者微信公众号

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK