在文本索引构建这种需要大量占用磁盘IO的任务,如果正巧你的内存还有点余粮,是否可以先索引存储到内存,然后再顺序写入到磁盘呢?,需要大量占用磁盘IO,如果正巧你的内存还有点余粮,是否可以先索引存储到内存,然后再顺序写入到磁盘呢?
将Linux的内存变为磁盘,可以通过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容器环境如何使用呢?是否需要在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
挂载,制定大小12Gdf -h
可以看到挂载的/mnt/tmpfs
类型为tmpfs
,大小12G在K8S里,tmpfs对应的是 emptyDir
Volume,将emptyDir.medium
指定为Memory
,可以让 Kubernetes 挂载 tmpfs(基于 RAM 的文件系统)。
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
对于运行在K8S上的spark,也可以通过volumes参数来指定使用tmpfs。
spark提供下面几种类型的volume
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
, 假设VolumeName
为spark-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占用: