GlusterFS服务器dmeventd进程占用大量内存问题处理
1. 问题描述
free -m
查看内存使用情况:
$ free -m
total used free shared buff/cache available
Mem: 7821 7412 162 1 246 173
Swap: 2047 1839 208
htop
命令按MEM%
排序(快捷键M):
发现 dmeventd 守护进程占用了大量的内存。pstree
命令查看 dmeventd 进程树。
$ pstree `pgrep dmeventd`
dmeventd───127*[{dmeventd}]
测试发现,dmeventd的子进程数量会随着k8s pvc的创建而增加,随着pvc的删除而减少。
2. 问题分析
2.1 设备映射器(Device Mapper)
在详细介绍 dm-event 服务之前,先了解一下设备映射器(Device Mapper)。设备映射器是 Linux 内核中的一个框架,用于在块设备上创建虚拟设备。这些虚拟设备可以进行各种操作,如逻辑卷管理、镜像、快照、条带化等。设备映射器通过称为“映射表”的数据结构定义这些操作。
2.2 dmeventd(Device Mapper Event Daemon)
dm-event 服务是 Linux 设备映射器(Device Mapper)子系统的一部分,主要用于监控和管理设备映射器设备的事件。dmeventd(Device Mapper Event Daemon)是该服务的核心守护进程,负责处理和响应与设备映射器相关的各种事件。
dmeventd 通常与逻辑卷管理器(LVM)一起使用,以提供以下功能:
- 自动恢复:在设备故障时自动尝试恢复。
- 监控和报警:监控设备状态并生成报警。
- 日志记录:记录设备状态和事件日志。
- 快照管理:管理逻辑卷的快照。
2.3 GlusterFS 与 dmeventd 的关系
在使用 GlusterFS 分布式文件系统时,通常会使用 LVM(Logical Volume Manager)来管理和配置存储卷。
GlusterFS 本身作为一个分布式文件系统,它并不直接依赖于 dmeventd 服务。dmeventd 通常用于监听和响应设备映射事件,这在 LVM 等场景下比较常见,但不是 GlusterFS 的核心依赖。在使用 GlusterFS 时,并不要求系统必须运行 dmeventd。
在GlusterFS官网中,也没有找到 dmeventd 相关内容。
3. 问题解决
综上分析,在 GlusterFS 分布式服务器中,如果 dmeventd 占用了大量内存,重启 dmeventd 是一种常见的解决方案,可以尝试释放内存和恢复其正常运行状态。
$ systemctl restart dm-event
4. 验证结果
4.1 查看内存使用情况
$ free -m
total used free shared buff/cache available
Mem: 7821 1562 5970 7 288 6002
Swap: 2047 1687 360
可以看到 dmeventd 占用的内存已经释放。
查看 dmeventd 进程树:
$ pstree `pgrep dmeventd`
dmeventd
之前随LV增加的 dmeventd 子进程也已经清除,仅剩重启后的dmeventd主进程。
4.2 K8S创建测试PVC
$ cat >> test-dmeventd-pvc.yaml << 'EOF'
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-dmeventd-logs
namespace: lamxops-test
spec:
accessModes:
- ReadWriteMany
storageClassName: heketi-gfs-r2
resources:
requests:
storage: 1Gi
EOF
$ kubectl create -f test-dmeventd-pvc.yaml
$ kubectl get pv | grep test-dmeventd
pvc-d8d67716-1480-4c83-9f8d-7dd9181f0bed 1Gi RWX Delete Bound lamxops-test/test-dmeventd-logs heketi-gfs-r2 12s
$ kubectl describe pv pvc-d8d67716-1480-4c83-9f8d-7dd9181f0bed | grep Path
Path: vol_29c819a7dca4cc4173fbf8f257dad53b
在GlusterFS服务器上查看 Volume vol_29c819a7dca4cc4173fbf8f257dad53b
的状态:
$ gluster volume info vol_29c819a7dca4cc4173fbf8f257dad53b
Volume Name: vol_29c819a7dca4cc4173fbf8f257dad53b
Type: Replicate
Volume ID: bd0dc38b-f40f-425f-a1ce-f8eadc8ee1a2
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 172.16.0.65:/var/lib/heketi/mounts/vg_0d76fd5d15fb483975b2b18e09f95259/brick_b74d3149ce0c501442737adc6ac3996f/brick
Brick2: 172.16.0.66:/var/lib/heketi/mounts/vg_f5acede91897a1c7e3ed3c5359304f39/brick_375ede46402fc85a037a6bbe4a7db53c/brick
Options Reconfigured:
user.heketi.id: 29c819a7dca4cc4173fbf8f257dad53b
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
$ gluster volume status vol_29c819a7dca4cc4173fbf8f257dad53b
Status of volume: vol_29c819a7dca4cc4173fbf8f257dad53b
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick 172.16.0.65:/var/lib/heketi/mounts/v
g_0d76fd5d15fb483975b2b18e09f95259/brick_b7
4d3149ce0c501442737adc6ac3996f/brick 49278 0 Y 4811
Brick 172.16.0.66:/var/lib/heketi/mounts/v
g_f5acede91897a1c7e3ed3c5359304f39/brick_37
5ede46402fc85a037a6bbe4a7db53c/brick 49278 0 Y 7498
Self-heal Daemon on localhost N/A N/A Y 11364
Self-heal Daemon on gfs-r2-node01 N/A N/A Y 11390
Task Status of Volume vol_29c819a7dca4cc4173fbf8f257dad53b
------------------------------------------------------------------------------
There are no active volume tasks
PVC创建成功。
4.3 查看 dmeventd 进程树
$ pstree `pgrep dmeventd`
dmeventd───2*[{dmeventd}]
随着新的PVC创建,GlusterFS通过LVM创建了LV,因此 dmeventd 进程数量+1。
4.4 K8S删除创建的测试PVC
$ kubectl delete -f test-dmeventd-pvc.yaml
persistentvolumeclaim "test-dmeventd-logs" deleted
GlusterFS 服务器上查看之前创建的Volume:
$ gluster volume status vol_29c819a7dca4cc4173fbf8f257dad53b
Volume vol_29c819a7dca4cc4173fbf8f257dad53b does not exist
再次查看 dmeventd 进程树:
$ pstree `pgrep dmeventd`
dmeventd
5. 总结
目前在K8S测试服务的GlusterFS集群上进行了测试实施,待稳定运行一段时间后,再到K8S正式服务的GlusterFS集群服务器上实施。