索引構建磁盤IO太高,巧用tmpfs讓內存來幫忙

在文本索引構建這種需要大量佔用磁盤IO的任務,如果正巧你的內存還有點餘糧,是否可以先索引存儲到內存,然後再順序寫入到磁盤呢?,需要大量佔用磁盤IO,如果正巧你的內存還有點餘糧,是否可以先索引存儲到內存,然後再順序寫入到磁盤呢?

將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佔用:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章