索引构建磁盘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
PersistentVolumeinto 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占用:

索引构建磁盘IO太高,巧用tmpfs让内存来帮忙的更多相关文章
- 磁盘IO过高时的处理办法 针对系统中磁盘IO负载过高的指导性操作
磁盘IO过高时的处理办法 针对系统中磁盘IO负载过高的指导性操作 主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参 ...
- Linux系统 磁盘IO过高排查总结
最近做的一个电商网站因为磁盘 I/O 过高导致访问速度奇慢,问题存在两个月有余未得到解决办法.此次排查原因的经验可以作下次问题的参考. 1.会看懂 top 系统命令出来的各项参数.此次是无意中发现 u ...
- 磁盘IO过高时的处理办法
针对系统中磁盘IO负载过高的指导性操作 主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参考,如果磁盘IO确实比较大 ...
- 一次磁盘IO过高分析过程
1.查看监控,发现整点时间有写IO过高情况
- mysql占用磁盘IO过高的解决办法
一.现象 最近发现Mysql服务器磁盘IO一直很高 [root@push-- ~]# iostat -k -d -x Linux -.el7.x86_64 (push--) 2019年07月05日 _ ...
- 磁盘IO过高时的参考
主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参考,如果磁盘IO确实比较大的话,是数据库,可以进行读写分离或者分库 ...
- linux 磁盘io利用率高,分析的正确姿势
一.背景简介 作为一个DBA难免不了会遇到性能问题,那么我们遇到性能问题该如何进行排查呢?例如我们在高并发的业务下,出现业务响应慢,处理时间长我们又该如何入手进行排查,本片文章将分析io高的情况下如何 ...
- jbd2/dm-2-8 io太高
用iotop查看发现[jbd2/dm-2-8]几乎占用了99%的io使用率,但是却没有输入输出 后来上网查找,网上有人说是个内核bug,需要升级内核,或者降低jdb2的提交次数,即重新挂载磁盘 添加c ...
- Linux如何查看与测试磁盘IO性能
1. 查看磁盘 IO 性能 1.1 top 命令 top 命令通过查看 CPU 的 wa% 值来判断当前磁盘 IO 性能,如果这个数值过大,很可能是磁盘 IO 太高了,当然也可能是其他原因,例如网络 ...
- 集群瓶颈为什么是磁盘io
阅读本文思考: 1.对磁盘IO了解多少 2.为什么是磁盘IO是瓶颈,有没有自己的答案 想了解磁盘io可以查看此帖:集群瓶颈:磁盘IO必读 (磁盘IO:磁盘输出输出) 集群的瓶颈提出多种看法,其中网络和 ...
随机推荐
- uni-app安卓手机无法连接到调试服务
uni-app连接安卓真机,发现接口调不通,打开Hbuilder下方的调试.可查看失败原因:如下图 解决方法:电脑变热点,手机连这个热点,就能解决手机和pc在同一局域网.具体操作,参照以下网站: ht ...
- flexible+rem移动端适配
- 《模拟龙生》|500行Go代码写一个随机冒险游戏|巨龙修为挑战开启
一.前言 新年就要到了,祝大家新的一年: 龙行龘龘, 前程朤朤! 白泽花了点时间,用 500行 Go 代码写了一个控制台的小游戏:<模拟龙生>,在游戏中你将模拟一条新生的巨龙,开始无尽的冒 ...
- C# 排序算法5:归并排序
归并排序,是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列.该算法是采用分治法. 原理: 1.申请空间,使其大小为两个已经排序 ...
- idea 中添加查看字节码工具
本文为博主原创,未经允许不得转载: jdk 的 bin 目录下存在 javap.exe 的工具,可通过 以下命令查看编译的字节码文件: javap -c Test.class 在 idea 中添加查看 ...
- linux chown 与 chmod 命令的使用
本文为博主原创,未经允许不得转载: 最近在做 linux 系统安全管理检查操作,频繁的用到了 chown 与 chmod 两个命令,觉得有必要对着两个命令总结一下. 一. chown 命令: 1. 设 ...
- 【JavaWeb】JSP基础和应用
JSP基础 JSP简介 JSP全称是Java Server Page,它和Servlet一样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/Servlet规范.JSP的本质其实就是一个 ...
- 如何开发一套苹果cms前端模板
本文运用了苹果cms官网的模板开发教程,开发了一套苹果cms的前端模板,感兴趣的同学可以去github下载使用. 什么是模板 模板是网站的主题外观,也被称为主题或皮肤.通过使用不同的模板,网站的前台可 ...
- Nacos源码 (4) 配置中心
本文阅读nacos-2.0.2的config源码,编写示例,分析推送配置.监听配置的原理. 客户端 创建NacosConfigService对象 Properties properties = new ...
- [转帖]TiDB Control 使用说明
https://docs.pingcap.com/zh/tidb/stable/tidb-control TiDB Control 是 TiDB 的命令行工具,用于获取 TiDB 状态信息,多用于调试 ...