目录

简介

先决条件

要求

使用的组件

缩写

思科VIM中的Ceph

Ceph监控机制的基础

阻塞I/O对StarOS VNF的影响

长阻塞I/O场景

Laggy计时器机制

RAID卡硬件故障

如何降低影响？

从Ceph存储移动到本地磁盘

CEPH配置调整

监控RAID卡硬件问题

CEPH_OSD_RESERVED_PCORES调谐

简介

本文档介绍在思科虚拟化基础设施管理器(VIM)上运行的StarOS VNF在Ceph存储服务受损时受到的影响，以及可以采取哪些措施来减轻影响。其解释假设思科VIM用作基础设施，但相同的理论可应用于任何Openstack环境。

先决条件

要求

Cisco 建议您了解以下主题：

- 思科StarOS

- 思科VIM

- OpenStack

- 西普

使用的组件

本文档中的信息基于以下软件和硬件版本：

- StarOS:21.16.c9

- 思科VIM:3.2.2(Openstack Queens)

本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始（默认）配置。如果您的网络处于活动状态，请确保您了解所有命令的潜在影响。

缩写

思科VIM

思科虚拟化基础设施管理器

VNF

虚拟网络功能

倒置OSD

Ceph对象存储守护程序

StarOS

思科移动分组核心解决方案的操作系统

思科VIM中的Ceph

此图片摘自《思科VIM管理员指南》。思科VIM使用Ceph作为存储后端。

Ceph支持块和对象存储，因此用于存储可连接到VM的VM映像和卷。依赖存储后端的多个OpenStack服务包括：

- 概览（OpenStack映像服务） — 使用Ceph存储映像。

- Cinder（OpenStack存储服务） — 使用Ceph创建可连接到虚拟机的卷。

- Nova（OpenStack计算服务） — 使用Ceph连接到Cinder创建的卷。

在许多情况下，在Ceph中为StarOS VNF创建/flash和/hd-raid卷，如下例所示。

openstack volume create --image `glance image-list | grep up-image | awk '{print $2}'` --size 16 --type LUKS up1-flash-boot

openstack volume create --size 20 --type LUKS up1-hd-raid

Ceph监控机制的基础

以下是Ceph文档中有关监控的说明：

每个Ceph OSD守护程序以小于每6秒的随机间隔检查其他Ceph OSD守护程序的心跳。如果相邻Ceph OSD守护程序在20秒宽限期内未显示心跳，则Ceph OSD守护程序可能会考虑关闭相邻Ceph OSD守护程序，并将其报告回Ceph监控器，后者会更新Ceph集群映射。默认情况下，来自不同主机的两个Ceph OSD守护程序必须向Ceph监控器报告另一个Ceph OSD守护程序关闭，然后Ceph监控器才确认报告的Ceph OSD守护程序关闭。

因此，通常需要大约20秒来检测OSD关闭，并且Ceph集群映射更新，只有在此VNF可以使用新OSD之后。在此期间，磁盘会被阻止I/O。

阻塞I/O对StarOS VNF的影响

如果磁盘I/O被阻止超过120秒，StarOS VNF将重新启动。对于与磁盘I/O和StarOS相关的xfssyncd/md0和xfs_db进程，当它检测到这些进程上出现卡滞超过120秒时，会特意重新启动。

StarOS调试控制台日志：

[ 1080.859817] INFO: task xfssyncd/md0:25787 blocked for more than 120 seconds.

[ 1080.862844] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.

[ 1080.866184] xfssyncd/md0 D ffff880c036a8290 0 25787 2 0x00000000

[ 1080.869321] ffff880aacf87d30 0000000000000046 0000000100000a9a ffff880a00000000

[ 1080.872665] ffff880aacf87fd8 ffff880c036a8000 ffff880aacf87fd8 ffff880aacf87fd8

[ 1080.876100] ffff880c036a8298 ffff880aacf87fd8 ffff880c0f2f3980 ffff880c036a8000

[ 1080.879443] Call Trace:

[ 1080.880526] [<ffffffff8123d62e>] ? xfs_trans_commit_iclog+0x28e/0x380

[ 1080.883288] [<ffffffff810297c9>] ? default_spin_lock_flags+0x9/0x10

[ 1080.886050] [<ffffffff8157fd7d>] ? _raw_spin_lock_irqsave+0x4d/0x60

[ 1080.888748] [<ffffffff812301b3>] _xfs_log_force_lsn+0x173/0x2f0

[ 1080.891375] [<ffffffff8104bae0>] ? default_wake_function+0x0/0x20

[ 1080.894010] [<ffffffff8123dc15>] _xfs_trans_commit+0x2a5/0x2b0

[ 1080.896588] [<ffffffff8121ff64>] xfs_fs_log_dummy+0x64/0x90

[ 1080.899079] [<ffffffff81253cf1>] xfs_sync_worker+0x81/0x90

[ 1080.901446] [<ffffffff81252871>] xfssyncd+0x141/0x1e0

[ 1080.903670] [<ffffffff81252730>] ? xfssyncd+0x0/0x1e0

[ 1080.905871] [<ffffffff81071d5c>] kthread+0x8c/0xa0

[ 1080.908815] [<ffffffff81003364>] kernel_thread_helper+0x4/0x10

[ 1080.911343] [<ffffffff81580805>] ? restore_args+0x0/0x30

[ 1080.913668] [<ffffffff81071cd0>] ? kthread+0x0/0xa0

[ 1080.915808] [<ffffffff81003360>] ? kernel_thread_helper+0x0/0x10

[ 1080.918411] **** xfssyncd/md0 stuck, resetting card

但是，它不限于120秒计时器，如果磁盘I/O被阻塞一段时间，甚至不到120秒，VNF可能会因各种原因重新启动。此处的输出是一个示例，显示由于磁盘I/O问题、有时连续的StarOS任务崩溃等原因导致的重新启动。它取决于活动磁盘I/O与存储问题的时间安排。

[ 2153.370758] Hangcheck: hangcheck value past margin!

[ 2153.396850] ata1.01: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen

[ 2153.396853] ata1.01: failed command: WRITE DMA EXT

--- skip ---

SYSLINUX 3.53 0x5d037742 EBIOS Copyright (C) 1994-2007 H. Peter Anvin

基本上，长阻塞I/O可视为StarOS VNF的一个关键问题，应尽可能减少。

长阻塞I/O场景

根据对多个客户部署和实验室测试的研究，确定了2种主要方案，可能导致Ceph的长阻塞I/O。

Laggy计时器机制

OSD之间有心跳机制，可检测OSD关闭。根据osd_heartbeat_grace值（默认为20秒），OSD被检测为失败。

在OSD状态出现波动或抖动时，宏计时器自动调整（变长）。 这可能会使osd_heartbeat_grace值更大。

正常情况下，心跳宽限为20秒

2019-01-09 16:58:01.715155 mon.ceph-XXXXX [INF] osd.2 failed (root=default,host=XXXXX) (2 reporters from different host after 20.000047 >= grace 20.000000)

但是，当一个存储节点出现多个网络抖动后，它会变得更大。

2019-01-10 16:44:15.140433 mon.ceph-XXXXX [INF] osd.2 failed (root=default,host=XXXXX) (2 reporters from different host after 256.588099 >= grace 255.682576)

因此，在上例中，需要256秒来检测OSD是否关闭。

RAID卡硬件故障

Ceph可能无法及时检测RAID卡硬件故障。RAID卡故障最终导致某种OSD挂起情况。在这种情况下，几分钟后检测到OSD关闭，足以使StarOS VNF重新启动。

当RAID卡挂起时，某些CPU核心在wa状态时占100%。

%Cpu20 : 2.6 us, 7.9 sy, 0.0 ni, 0.0 id, 89.4 wa, 0.0 hi, 0.0 si, 0.0 st

%Cpu21 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

%Cpu22 : 31.3 us, 5.1 sy, 0.0 ni, 63.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

%Cpu23 : 0.0 us, 0.0 sy, 0.0 ni, 28.1 id, 71.9 wa, 0.0 hi, 0.0 si, 0.0 st

%Cpu24 : 0.0 us, 0.0 sy, 0.0 ni, 0.0 id,100.0 wa, 0.0 hi, 0.0 si, 0.0 st

%Cpu25 : 0.0 us, 0.0 sy, 0.0 ni, 0.0 id,100.0 wa, 0.0 hi, 0.0 si, 0.0 st

OSD的CPU内核逐渐耗尽，OSD也逐渐下降，有时间差。

2019-01-01 17:08:05.267629 mon.ceph-XXXXX [INF] Marking osd.2 out (has been down for 602 seconds)

2019-01-01 17:09:25.296955 mon.ceph-XXXXX [INF] Marking osd.4 out (has been down for 603 seconds)

2019-01-01 17:11:10.351131 mon.ceph-XXXXX [INF] Marking osd.7 out (has been down for 604 seconds)

2019-01-01 17:16:40.426927 mon.ceph-XXXXX [INF] Marking osd.10 out (has been down for 603 seconds)

同时，在ceph.log中检测慢速请求。

2019-01-01 16:57:26.743372 mon.XXXXX [WRN] Health check failed: 1 slow requests are blocked > 32 sec. Implicated osds 2 (REQUEST_SLOW)

2019-01-01 16:57:35.129229 mon.XXXXX [WRN] Health check update: 3 slow requests are blocked > 32 sec. Implicated osds 2,7,10 (REQUEST_SLOW)

2019-01-01 16:57:38.055976 osd.7 osd.7 [WRN] 1 slow requests, 1 included below; oldest blocked for > 30.216236 secs

2019-01-01 16:57:39.048591 osd.2 osd.2 [WRN] 1 slow requests, 1 included below; oldest blocked for > 30.635122 secs

-----skip-----

2019-01-01 17:06:22.124978 osd.7 osd.7 [WRN] 78 slow requests, 1 included below; oldest blocked for > 554.285311 secs

2019-01-01 17:06:25.114453 osd.4 osd.4 [WRN] 19 slow requests, 1 included below; oldest blocked for > 546.221508 secs

2019-01-01 17:06:26.125459 osd.7 osd.7 [WRN] 78 slow requests, 1 included below; oldest blocked for > 558.285789 secs

2019-01-01 17:06:27.125582 osd.7 osd.7 [WRN] 78 slow requests, 1 included below; oldest blocked for > 559.285915 secs

此图显示了使用时间线阻止I/O请求的时间。通过在ceph.log中绘制慢速请求日志来创建该图。它表明，阻塞时间会随着时间推移而变长。

如何降低影响？

从Ceph存储移动到本地磁盘

减轻影响的最简单方法是从Ceph存储移动到本地磁盘。StarOS使用2个磁盘（/flash和/hd-raid），可以只将/flash移动到本地磁盘，这使StarOS VNF对于Ceph问题更加稳健。使用共享存储（如Ceph）的负面是，当出现问题时，使用共享存储的所有VNF都会受到影响。通过使用本地磁盘，存储问题的影响可以最小化到仅在受影响节点上运行的VNF。而且，上一节中提到的场景仅适用于Ceph，不适用于本地磁盘。但本地磁盘的反面是，在重新部署虚拟机时，磁盘的内容（如StarOS映像、配置、核心文件、计费记录）无法保留。它也可能影响VNF自愈机制。

CEPH配置调整

从StarOS VNF的角度，建议使用以下新的Ceph参数，以尽量减少上述阻塞I/O时间。

<默认设置>

"mon_osd_adjust_heartbeat_grace": "true",

"osd_client_watch_timeout": "30",

"osd_max_markdown_count": "5",

"osd_heartbeat_grace": "20",

<新设置>

"mon_osd_adjust_heartbeat_grace": "false",

"osd_client_watch_timeout": "10",

"osd_max_markdown_count": "1",

"osd_heartbeat_grace": "10",

它包括：

- 该拉格计时器机构被禁用，无自动调整

- 心跳宽限时间缩短

- OSD立即标记为关闭（默认为过去600秒内5次）

新参数在实验室中测试，OSD关闭检测时间缩短到约10秒，最初大约30秒，默认配置为Ceph。

监控RAID卡硬件问题

对于RAID卡硬件场景，由于问题的性质，可能仍难以及时检测，因为这会造成OSD间歇性工作而I/O被阻塞的情况。此解决方案没有单一解决方案，但建议监控服务器硬件日志以查找RAID卡故障，或通过某些脚本监控ceph.log中的慢请求日志，并采取一些措施，例如主动关闭受影响的OSD。

CEPH_OSD_RESERVED_PCORES调谐

这与上述场景无关，但是如果Ceph性能因I/O操作过重而出现问题，则增加CEPH_OSD_RESEREVED_PCORES值可以使Ceph I/O性能更好。默认情况下，思科VIM上的CEPH_OSD_RESERVED_PCORES配置为2并可以增加。