ceph-osd占用大量内存

查看现在情况:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# top -p $(pidof ceph-osd)
top - 11:30:08 up 26 days, 16:38,  3 users,  load average: 0.74, 0.57, 0.72
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.5 us,  1.6 sy,  0.0 ni, 94.1 id,  1.3 wa,  0.0 hi,  0.5 si,  0.0 st
MiB Mem : 91.5/16008.3  [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||        ]
MiB Swap:  0.0/0.0      [                                                                                                    ]

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   5831 167       20   0   12.7g  11.0g   7720 S   2.7  70.5 617:42.90 ceph-osd


# kubectl -n rook-ceph  exec -it rook-ceph-tools-6ccb958485-j7pvb  -- bash
# ceph osd tree
ID  CLASS  WEIGHT   TYPE NAME       STATUS  REWEIGHT  PRI-AFF
-1         3.00000  root default
-3         1.00000      host node1
 1    hdd  1.00000          osd.1       up   1.00000  1.00000
-7         1.00000      host node2
 2    hdd  1.00000          osd.2       up   1.00000  1.00000
-5         1.00000      host node3
 0    hdd  1.00000          osd.0       up   1.00000  1.00000
### 太残忍了, 就 15,6G 的内存你就要 13G, 还要不要其他进程活了?
# ceph tell osd.0 config show | grep -w osd_memory_target
    "osd_memory_target": "13344836812",
# ceph tell osd.1 config show | grep -w osd_memory_target
    "osd_memory_target": "13344836812",
# ceph tell osd.2 config show | grep -w osd_memory_target
    "osd_memory_target": "13344836812",
### 安? 没有限制资源?难怪敢用那么多的内存。
# kubectl  -n rook-ceph get pods rook-ceph-osd-0-7c76474f7-tnhc6 -ojson | jq .spec.containers[].resources
{}

资源限制:

1
按照建议限制个 2cpu 和 4G 内存

再看看现在的情况

1
# kubectl  -n rook-ceph get pods rook-ceph-osd-0-6ff54bb9c7-vbk59 -ojson | jq .spec.containers[].resources
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
### 这下看着舒服了
# top -p $(pidof ceph-osd)
top - 11:50:13 up 26 days, 16:58,  3 users,  load average: 0.71, 0.97, 0.89
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.7 us,  1.1 sy,  0.0 ni, 96.0 id,  0.1 wa,  0.0 hi,  0.1 si,  0.0 st
MiB Mem : 23.6/16008.3  [||||||||||||||||||||||||]
MiB Swap:  0.0/0.[]
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
2172679 167       20   0 1462020 455712  33268 S   2.3   2.8   0:11.17 ceph-osd

# kubectl -n rook-ceph  exec -it rook-ceph-tools-6ccb958485-j7pvb  -- bash
# ceph tell osd.0 config show | grep -w osd_memory_target
    "osd_memory_target": "3435973836",

备忘

1,如何在运行中的 ROOK CEPH 集群中设置 resource limit?

这就要使用 K8s 提供的功能了。K8s 不支持对运行中的 Pod 进行更新(除非你 delete 掉 pod,更新 pod 对应的 yaml,再使用该 yaml 重新创建 Pod),但是支持对运行中的 deployment 进行 resource limit 更新(注意:该更新同样会自动重启该 deployment 下的 Pod!)。

举个例子,假设 OSD0 之前没有设置 resource limit:

1
2
3
4
gemfield@ThinkPad-X1C:~$ kubectl -n rook-ceph describe pod rook-ceph-osd-0-6b89596bd8-tm966 | grep -i limit
      POD_MEMORY_LIMIT:             node allocatable (limits.memory)
      POD_CPU_LIMIT:                node allocatable (limits.cpu)
    SizeLimit:  <unset>

现在针对 OSD0 的 deployment 进行 resource limit 的更新(这里 limit 了 memory)针对运行后的 osd 进行资源限制:

1
2
gemfield@ThinkPad-X1C:~$ kubectl -n rook-ceph set resources deployment.v1.apps/rook-ceph-osd-0 --limits=memory=8192Mi
deployment.apps/rook-ceph-osd-0 resource requirements updated

最小硬件配置

安装 Ceph 集群的一个最小硬件推荐,如果小于这个配置的话,你就不用安装了,不然只会更痛苦。尤其是 recovery 的时候,呵呵,痛不欲生。

img

简而言之,CPU 一般不是问题,主要就是内存和网络。OSD 之间的网络最好是 10GbE+;内存会消耗多少呢?以 ROOK 为例,默认配置部署完成后(假设 14 块磁盘,每块 4TB),会启动:

  • 14 个 ceph-osd;
  • 3 个 ceph-mon;
  • 2 个 ceph-mds;
  • 1 个 ceph-rgw;
  • 1 个 ceph-mgr;

对于 OSD 进程来说,每个 daemon 每 TB 需要 1GB,那么在这个上下文里:

  • 每个 OSD 需要 4GB 内存,14 个 OSD 就需要 56GB 内存;
  • 3 个 ceph-mon 就需要 6GB 内存;
  • 2 个 mds 需要 4GB 内存。

但是,这是官方最小的内存推荐;下面 Gemfield 给出自己的推荐:

  • 每个 OSD 每 TB 配置 2GB 内存,因为要考虑 recovery,这个是很耗费内存的,于是上述配置需要 112GB 内存;
  • 每个 ceph-mon 配置 4GB 内存;
  • 每个 ceph-mds 需要配置 10G 内存。

经过上述实践,我们发现在现有k8s集群搭建一套ceph存储只要满足以下两点即可:

  • 内核高于4.17
  • 未被格式化分区的存储设备

整个部署流程对比非容器化部署更容易上手,利用k8s天生优势,保证了存储服务的高可用性。

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up