经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
索引构建磁盘IO太高,巧用tmpfs让内存来帮忙
来源:cnblogs  作者:JadePeng  时间:2024/2/7 9:52:01  对本文有异议

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

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

tmpfs介绍

以下是ChatGPT的介绍:

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

创建一个tmpfs文件系统:

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

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

挂载tmpfs文件系统:

  1. 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容器独享的,不能和其他容器共享,有效期就是容器的生命周期。

我们来实验:

  1. [root@dev ~]#docker run -it --rm --mount type=tmpfs,destination=/mnt/tmpfs,tmpfs-mode=1770,tmpfs-size=12G gcc:12 bash
  2. root@87b86fe9a4d0:/# df -h
  3. Filesystem Size Used Avail Use% Mounted on
  4. overlay 182G 160G 13G 93% /
  5. tmpfs 64M 0 64M 0% /dev
  6. tmpfs 63G 0 63G 0% /sys/fs/cgroup
  7. shm 64M 0 64M 0% /dev/shm
  8. /dev/sda2 182G 160G 13G 93% /etc/hosts
  9. tmpfs 12G 0 12G 0% /mnt/tmpfs
  10. tmpfs 63G 0 63G 0% /proc/acpi
  11. tmpfs 63G 0 63G 0% /proc/scsi
  12. 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 配置示例

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: test-pd
  5. spec:
  6. containers:
  7. - image: registry.k8s.io/test-webserver
  8. name: test-container
  9. volumeMounts:
  10. - mountPath: /cache
  11. name: cache-volume
  12. volumes:
  13. - name: cache-volume
  14. emptyDir:
  15. sizeLimit: 500Mi
  16. 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:

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

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

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

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

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

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

原文链接:https://www.cnblogs.com/xiaoqi/p/18009519/tmpfs

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号