识别问题和解决方案

系统是否正常运行?

如果您收到 Swift 宕机的报告,请执行以下基本检查

  1. 运行 Swift 功能测试。

  2. 从您的数据中心的服务器上,使用 curl 检查 /healthcheck(见下文)。

  3. 如果您有监控系统,请检查您的监控系统。

  4. 检查您的硬件负载均衡器基础设施。

  5. 在代理节点上运行 swift-recon。

功能测试用法

我们建议您设置功能测试以针对您的生产系统运行。定期运行,这可以成为验证系统配置是否正确的有用工具。此外,它还可以提供有关系统故障的早期预警(如果功能测试停止工作,用户应用程序也可能停止工作)。

运行功能测试的脚本位于 swift/.functests 中。

外部监控

我们使用 pingdom.com 监控外部 Swift API。我们建议以下操作

  • /healthcheck 执行 GET 请求

  • 创建一个容器,使其公开 (x-container-read: .r*,.rlistings),在容器中创建一个小文件;对该对象执行 GET 请求

诊断:通用方法

  • 查看您的监控系统中服务状态。

  • 除了系统监控工具和用户的问题日志记录外,Swift 错误通常会导致日志条目(参见 诊断:解释 /var/log/swift/ 文件中的消息)。

  • 查看您的部署工具生成的任何日志。

  • 应审查日志文件是否存在错误签名(如下所示),这些错误可能指向已知问题,或诊断工具报告的根本原因问题,然后再进行升级。

依赖项

Swift 软件依赖于整体系统健康状况。操作系统层面的网络连接、域名解析、用户管理、硬件和系统配置以及内存和可用磁盘空间方面的容量问题,可能会导致次要的 Swift 问题。应在诊断 Swift 问题之前解决系统层面的问题。

诊断:Swift-dispersion-report

swift-dispersion-report 是一个用于评估系统整体健康状况的有用工具。配置 swift-dispersion 报告,至少覆盖您系统中的每个磁盘驱动器(通常为 1% 的覆盖率)。有关如何配置和使用离散报告工具的详细信息,请参见 离散报告

swift-dispersion-report 工具可能需要很长时间才能运行,尤其是在任何服务器宕机的情况下。我们建议您定期运行它(例如,在 cron 作业中)并保存结果。这样可以轻松地参考最新的报告,而无需等待长时间运行的命令完成。

诊断:系统是否响应 /healthcheck

当您想确定 Swift 端点是否正在运行时,请运行 curl -k 针对 https://$ENDPOINT/healthcheck

诊断:解释 /var/log/swift/ 文件中的消息

注意

在 Hewlett Packard Enterprise Helion Public Cloud 中,我们将日志发送到 proxy.log(代理服务器日志)、server.log(对象服务器、帐户服务器、容器服务器日志)、background.log(所有其他服务器 [对象复制器等])。

下表列出了已知问题

日志文件

签名

问题

采取的步骤

/var/log/syslog

kernel: [] sd …. [csbu:sd…] Sense Key: Medium Error

表明磁盘表面存在问题

在目标节点上运行 swift-drive-audit 以检查磁盘错误,修复磁盘错误

/var/log/syslog

kernel: [] sd …. [csbu:sd…] Sense Key: Hardware Error

表明存储硬件存在问题

在目标节点上运行诊断程序以检查磁盘故障,更换故障磁盘

/var/log/syslog

kernel: [] …. I/O error, dev sd…. ,sector ….

在目标节点上运行诊断程序以检查磁盘错误

/var/log/syslog

pound: NULL get_thr_arg

多个线程被唤醒

噪音,可以忽略

/var/log/swift/proxy.log

…. ERROR …. ConnectionTimeout ….

存储节点没有及时响应

检查节点是否宕机、未运行 Swift、未配置、存储离线或网络问题是否存在于代理和未响应的节点之间

/var/log/swift/proxy.log

proxy-server …. HTTP/1.0 500 ….

代理服务器报告了内部服务器错误

检查日志中在报告错误时发生的任何错误,以尝试了解错误原因。

/var/log/swift/server.log

…. ERROR …. ConnectionTimeout ….

存储服务器没有及时响应

检查节点是否宕机、未运行 Swift、未配置、存储离线或网络问题是否存在于服务器和未响应的节点之间

/var/log/swift/server.log

…. ERROR …. Remote I/O error: ‘/srv/node/disk….

存储设备没有按预期响应

运行 swift-drive-audit 并检查错误中命名的文件系统是否存在损坏(卸载 & xfs_repair)。检查文件系统是否已挂载并正在工作。

/var/log/swift/background.log

object-server ERROR container update failed …. Connection refused

无法联系到容器服务器节点

检查节点是否宕机、未运行 Swift、未配置、存储离线或网络问题是否存在于服务器和未响应的节点之间

/var/log/swift/background.log

object-updater ERROR with remote …. ConnectionTimeout

远程容器服务器很忙

如果容器很大,则更新它时可能会出现一些错误。但是,如果网络存在问题,也可能发生此错误。

/var/log/swift/background.log

account-reaper STDOUT: …. error: ECONNREFUSED

网络连接问题或目标服务器宕机。

解决网络问题或重新启动目标服务器

/var/log/swift/background.log

…. ERROR …. ConnectionTimeout

存储服务器没有及时响应

目标服务器可能很忙。但是,如果网络存在问题,也可能发生此错误。

/var/log/swift/background.log

…. ERROR syncing …. Timeout

同步到另一个节点的数据时发生超时。

目标服务器可能很忙。但是,如果网络存在问题,也可能发生此错误。

/var/log/swift/background.log

…. ERROR Remote drive not mounted ….

存储服务器磁盘不可用

修复并重新挂载文件系统(在远程节点上)

/var/log/swift/background.log

object-replicator …. responded as unmounted

存储服务器磁盘不可用

修复并重新挂载文件系统(在远程节点上)

/var/log/swift/*.log

STDOUT: EXCEPTION IN

发生意外错误

阅读 Traceback 详细信息,如果它与已知问题(例如,活动网络/磁盘问题)匹配,请在解决主要问题后检查是否会再次发生。

/var/log/rsyncd.log

rsync: mkdir “/disk….failed: No such file or directory….

本地存储服务器磁盘不可用

在节点上运行诊断程序以检查故障或未挂载的磁盘

/var/log/swift*

Exception: Could not bind to 0.0.0.0:6xxx

可能的 Swift 进程重启问题。这表明旧的 Swift 进程仍在运行。

重新启动 Swift 服务。如果报告某些 Swift 服务已宕机,请检查它们是否留下了残留进程。

诊断:Parted 报告备份 GPT 表已损坏

  • 如果 GPT 表损坏,则在运行以下命令时应观察到如下消息

    $ sudo parted -l
    
    Error: The backup GPT table is corrupt, but the primary appears OK,
    so that will be used.
    
    OK/Cancel?
    

要修复,请转到 修复损坏的 GPT 表(损坏的磁盘分区)

诊断:驱动器诊断报告文件系统标签不可接受

如果诊断报告类似于“FS label: obj001dsk011 is not acceptable”,则表明分区具有有效的磁盘标签,但无效的文件系统标签。在这种情况下,请按以下步骤操作

  1. 验证磁盘标签是否正确

    $ FS=/dev/sd#1
    
    $ sudo parted -l | grep object
    
  2. 如果分区标签不一致,则在继续之前解决磁盘标签问题

    $ sudo parted -s ${FS} name ${PART_NO} ${PART_NAME} #Partition Label
    $ # PART_NO is 1 for object disks and 3 for OS disks
    $ # PART_NAME follows the convention seen in "sudo parted -l | grep object"
    
  3. 如果缺少文件系统标签,则小心创建它

    $ sudo xfs_admin -l ${FS} #Filesystem label (12 Char limit)
    
    $ # Check for the existence of a FS label
    
    $ OBJNO=<3 Length Object No.>
    
    $ # I.E OBJNO for sw-stbaz3-object0007 would be 007
    
    $ DISKNO=<3 Length Disk No.>
    
    $ # I.E DISKNO for /dev/sdb would be 001, /dev/sdc would be 002 etc.
    
    $ sudo xfs_admin -L "obj${OBJNO}dsk${DISKNO}" ${FS}
    
    $ # Create a FS Label
    

诊断:失败的 LUN

注意

HPE Helion Public Cloud 使用直接连接的 SmartArray 控制器/驱动器。此处的信息特定于该环境。此处提到的 hpacucli 实用程序在您的环境中可能称为 hpssacli。

swift_diagnostics 挂载检查可能会返回警告,指示 LUN 已失败,通常伴随着驱动器审核检查失败和设备错误。

这种情况通常是由驱动器故障引起的,如果驱动器检查也报告了底层驱动器的故障状态,则请按照更换磁盘的步骤操作。

否则,可以按以下方式重新启用 LUN

  1. 生成 hpssacli 诊断报告。此报告允许 DC 团队排除潜在的电缆或硬件问题,因此在排除故障时立即运行它非常重要。您稍后会返回并 grep 此文件以获取更多详细信息,但现在只需生成它即可。

    $ sudo hpssacli controller all diag file=/tmp/hpacu.diag ris=on xml=off zip=off
    

使用以下说明导出以下变量,然后再继续操作。

  1. 打印逻辑驱动器及其编号的列表,并记下故障驱动器的编号和数组值(示例输出:“array A logicaldrive 1…” 将导出为 LDRIVE=1)

    $ sudo hpssacli controller slot=1 ld all show
    
  2. 将从上一个命令检索到的逻辑驱动器编号导出到 LDRIVE 变量

    $ export LDRIVE=<LogicalDriveNumber>
    
  3. 打印数组值和 Port:Box:Bay,用于所有驱动器,并记下故障驱动器的 Port:Box:Bay(示例输出:“ array A physicaldrive 2C:1:1…” 将导出为 PBOX=2C:1:1)。将此输出的数组值与之前命令获得的数组值进行匹配,以确保您正在处理相同的驱动器。此外,数组值通常与设备名称匹配(例如,在“array c”的情况下为 /dev/sdc),但我们将运行另一个命令以确保我们正在处理正确的设备。

    $ sudo hpssacli controller slot=1 pd all show
    

注意

有时,LUN 可能看起来已失败,但实际上并非如此,并且无法挂载,但 hpssacli/parted 命令可能未显示 LUN/驱动器存在任何问题。在这种情况下,文件系统可能已损坏,并且可能需要运行 sudo xfs_check /dev/sd[a-l][1-2] 以查看是否存在 xfs 问题。运行此命令的结果可能需要运行 xfs_repair

  1. 将故障驱动器的 Port:Box:Bay 导出到 PBOX 变量

    $ export PBOX=<Port:Box:Bay>
    
  2. 打印物理设备信息并记下磁盘名称(示例输出:“Disk Name: /dev/sdk” 将导出为 DEV=/dev/sdk)

    $ sudo hpssacli controller slot=1 ld ${LDRIVE} show detail | grep -i "Disk Name"
    
  3. 从前面的命令导出设备名称变量(例如:/dev/sdk)

    $ export DEV=<Device>
    
  4. 导出文件系统变量。在操作系统和数据存储之间拆分的磁盘,通常 sda 和 sdb,应仅对其数据文件系统进行修复,通常为 /dev/sda2 和 /dev/sdb2。其他仅数据磁盘在设备上只有一个分区,因此文件系统将为 1。无论哪种情况,您都应该通过运行 df -h | grep /srv/node 并使用列表中针对相关设备的数据文件系统作为导出进行验证。

    $ export FS=<Filesystem>
    
  5. 验证 LUN 是否已失败,并且设备是否未失败

    $ sudo hpssacli controller slot=1 ld all show
    $ sudo hpssacli controller slot=1 pd all show
    $ sudo hpssacli controller slot=1 ld ${LDRIVE} show detail
    $ sudo hpssacli controller slot=1 pd ${PBOX} show detail
    
  6. 停止 Swift 和 rsync 服务

    $ sudo service rsync stop
    $ sudo swift-init shutdown all
    
  7. 卸载有问题驱动器,修复 LUN 和文件系统

    $ sudo umount ${FS}
    
  8. 如果卸载失败,则应运行 lsof 搜索挂载点并杀死任何残留进程,然后再重复卸载

    $ sudo hpacucli controller slot=1 ld ${LDRIVE} modify reenable
    $ sudo xfs_repair ${FS}
    
  9. 如果 xfs_repair 抱怨可能存在日志数据,请使用 xfs_repair -L 选项来将日志零化。

  10. 完成测试后挂载文件系统,并清理其 lost and found 区域。

    $ sudo mount ${FS} /mnt
    $ sudo rm -rf /mnt/lost+found/
    $ sudo umount /mnt
    
  11. 挂载文件系统并重新启动 Swift 和 rsync。

  12. 运行以下命令以确定是否需要 DC 工单来检查节点的电缆

    $ grep -y media.exchanged /tmp/hpacu.diag
    $ grep -y hot.plug.count /tmp/hpacu.diag
    
  13. 如果输出报告任何非 0x00 值,则表明应检查电缆。例如,记录 DC 工单以检查驱动器和扩展器之间的 sas 电缆。

诊断:慢速磁盘设备

注意

collectl 是一种开源的性能收集/分析工具。

如果诊断报告了类似 sda: drive is slow 的消息,则应登录到节点并运行以下命令(删除 -c 1 选项以连续监视数据)

$ /usr/bin/collectl -s D -c 1
waiting for 1 second sample...
# DISK STATISTICS (/sec)
#          <---------reads---------><---------writes---------><--------averages--------> Pct
#Name       KBytes Merged  IOs Size  KBytes Merged  IOs Size  RWSize  QLen  Wait SvcTim Util
sdb            204      0   33    6      43      0    4   11       6     1     7      6   23
sda             84      0   13    6     108     21    6   18      10     1     7      7   13
sdc            100      0   16    6       0      0    0    0       6     1     7      6    9
sdd            140      0   22    6      22      0    2   11       6     1     9      9   22
sde             76      0   12    6     255      0   52    5       5     1     2      1   10
sdf            276      0   44    6       0      0    0    0       6     1    11      8   38
sdg            112      0   17    7      18      0    2    9       6     1     7      7   13
sdh           3552      0   73   49       0      0    0    0      48     1     9      8   62
sdi             72      0   12    6       0      0    0    0       6     1     8      8   10
sdj            112      0   17    7      22      0    2   11       7     1    10      9   18
sdk            120      0   19    6      21      0    2   11       6     1     8      8   16
sdl            144      0   22    7      18      0    2    9       6     1     9      7   18
dm-0             0      0    0    0       0      0    0    0       0     0     0      0    0
dm-1             0      0    0    0      60      0   15    4       4     0     0      0    0
dm-2             0      0    0    0      48      0   12    4       4     0     0      0    0
dm-3             0      0    0    0       0      0    0    0       0     0     0      0    0
dm-4             0      0    0    0       0      0    0    0       0     0     0      0    0
dm-5             0      0    0    0       0      0    0    0       0     0     0      0    0

查看 WaitSvcTime 值。这些值超过 50 毫秒是不正常的。已知这会影响客户性能(上传/下载)。对于控制器问题,许多/所有驱动器都会显示较长的等待时间和响应时间。重启可能会解决问题;否则需要更换硬件。

另一种查看数据的方式如下

$ /opt/hp/syseng/disk-anal.pl -d
Disk: sda  Wait: 54580 371  65  25  12   6   6   0   1   2   0  46
Disk: sdb  Wait: 54532 374  96  36  16   7   4   1   0   2   0  46
Disk: sdc  Wait: 54345 554 105  29  15   4   7   1   4   4   0  46
Disk: sdd  Wait: 54175 553 254  31  20  11   6   6   2   2   1  53
Disk: sde  Wait: 54923  66  56  15   8   7   7   0   1   0   2  29
Disk: sdf  Wait: 50952 941 565 403 426 366 442 447 338  99  38  97
Disk: sdg  Wait: 50711 689 808 562 642 675 696 185  43  14   7  82
Disk: sdh  Wait: 51018 668 688 483 575 542 692 275  55  22   9  87
Disk: sdi  Wait: 51012 1011 849 672 568 240 344 280  38  13   6  81
Disk: sdj  Wait: 50724 743 770 586 662 509 684 283  46  17  11  79
Disk: sdk  Wait: 50886 700 585 517 633 511 729 352  89  23   8  81
Disk: sdl  Wait: 50106 617 794 553 604 504 532 501 288 234 165 216
Disk: sda  Time: 55040  22  16   6   1   1  13   0   0   0   3  12

Disk: sdb  Time: 55014  41  19   8   3   1   8   0   0   0   3  17
Disk: sdc  Time: 55032  23  14   8   9   2   6   1   0   0   0  19
Disk: sdd  Time: 55022  29  17  12   6   2  11   0   0   0   1  14
Disk: sde  Time: 55018  34  15  11  12   1   9   0   0   0   2  12
Disk: sdf  Time: 54809 250  45   7   1   0   0   0   0   0   1   1
Disk: sdg  Time: 55070  36   6   2   0   0   0   0   0   0   0   0
Disk: sdh  Time: 55079  33   2   0   0   0   0   0   0   0   0   0
Disk: sdi  Time: 55074  28   7   2   0   0   2   0   0   0   0   1
Disk: sdj  Time: 55067  35  10   0   1   0   0   0   0   0   0   1
Disk: sdk  Time: 55068  31  10   3   0   0   1   0   0   0   0   1
Disk: sdl  Time: 54905 130  61   7   3   4   1   0   0   0   0   3

这显示了一天内等待时间和响应时间的历史分布。阅读方式如下

  • sda 执行了 54580 次操作,等待时间较短,371 次操作等待时间较长,65 次操作等待时间更长。

  • sdl 执行了 50106 次操作,等待时间较短,但正如你所看到的,许多操作花费了更长时间。

很明显,sdf 到 sdl 存在问题。实际上,sda 到 sde 通常会有很多零数据。但也许这是一个繁忙的系统。在这个例子中,更换控制器是值得的,因为单个驱动器可能没问题。

更换控制器后,使用 collectl -s D(如上所述)查看问题是否已解决。disk-anal.pl 将继续显示历史数据。你可以按如下方式查看最近的数据。它仅查看 13:15 到 14:15 的数据。正如你所看到的,这是一个相对干净的系统(很少或没有较长的等待或响应时间)

$ /opt/hp/syseng/disk-anal.pl -d -t 13:15-14:15
Disk: sda  Wait:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdb  Wait:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdc  Wait:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdd  Wait:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sde  Wait:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdf  Wait:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdg  Wait:  3594   6   0   0   0   0   0   0   0   0   0   0
Disk: sdh  Wait:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdi  Wait:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdj  Wait:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdk  Wait:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdl  Wait:  3599   1   0   0   0   0   0   0   0   0   0   0
Disk: sda  Time:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdb  Time:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdc  Time:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdd  Time:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sde  Time:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdf  Time:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdg  Time:  3594   6   0   0   0   0   0   0   0   0   0   0
Disk: sdh  Time:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdi  Time:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdj  Time:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdk  Time:  3600   0   0   0   0   0   0   0   0   0   0   0
Disk: sdl  Time:  3599   1   0   0   0   0   0   0   0   0   0   0

对于较长的等待时间,如果响应时间看起来正常,请检查逻辑驱动器缓存状态。虽然缓存可能已启用,但它可以按驱动器禁用。

诊断:重新映射正在经历 URE 的扇区

  1. kern.log 中找到坏扇区、设备和文件系统。

  2. 设置环境变量 SEC、DEV 和 FS,例如

    $ SEC=2930954256
    $ DEV=/dev/sdi
    $ FS=/dev/sdi1
    
  3. 验证扇区是否损坏

    $ sudo dd if=${DEV} of=/dev/null bs=512 count=1 skip=${SEC}
    
  4. 如果扇区损坏,此命令将输出输入/输出错误

    dd: reading `/dev/sdi`: Input/output error
    0+0 records in
    0+0 records out
    
  5. 防止 chef 在修复进行时尝试重新挂载文件系统

    $ sudo mv /etc/chef/client.pem /etc/chef/xx-client.xx-pem
    
  6. 停止 Swift 和 rsync 服务

    $ sudo service rsync stop
    $ sudo swift-init shutdown all
    
  7. 卸载有问题驱动器

    $ sudo umount ${FS}
    
  8. 覆盖/重新映射坏扇区

    $ sudo dd_rescue -d -A -m8b -s ${SEC}b ${DEV} ${DEV}
    
  9. 首次运行此命令时,该命令应报告输入/输出错误。如果成功重新映射了坏扇区,第二次运行该命令不应报告输入/输出错误。

  10. 验证扇区现在可读

    $ sudo dd if=${DEV} of=/dev/null bs=512 count=1 skip=${SEC}
    
  11. 如果扇区现在可读,此命令不应报告输入/输出错误。

  12. 如果列出了多个有问题扇区,请将 SEC 环境变量设置为列表中下一个扇区

    $ SEC=123456789
    
  13. 从第 8 步重复。

  14. 修复文件系统

    $ sudo xfs_repair ${FS}
    
  15. 如果 xfs_repair 报告文件系统具有有价值的文件系统更改

    $ sudo xfs_repair ${FS}
    Phase 1 - find and verify superblock...
    Phase 2 - using internal log
            - zero log...
    ERROR: The filesystem has valuable metadata changes in a log which
    needs to be replayed.
    Mount the filesystem to replay the log, and unmount it before
    re-running xfs_repair.
    If you are unable to mount the filesystem, then use the -L option to
    destroy the log and attempt a repair. Note that destroying the log may
    cause corruption -- please attempt a mount of the filesystem before
    doing this.
    
  16. 你应该尝试挂载文件系统,并清除 lost+found 区域

    $ sudo mount $FS /mnt
    $ sudo rm -rf /mnt/lost+found/*
    $ sudo umount /mnt
    
  17. 如果文件系统无法挂载,则需要使用 xfs_repair -L 选项强制日志清零。重复第 11 步。

  18. 如果 xfs_repair 报告遇到其他输入/输出错误,请按如下方式获取扇区详细信息

    $ sudo grep "I/O error" /var/log/kern.log | grep sector | tail -1
    
  19. 如果报告了新的输入/输出错误,请将 SEC 环境变量设置为有问题扇区号

    $ SEC=234567890
    
  20. 从第 8 步重复

  21. 重新挂载文件系统并重新启动 swift 和 rsync。

    • 如果 kern.log 中的所有 URE 都已修复,并且你仍然无法修复 xfs_repair 磁盘,则可能是 URE 损坏了文件系统或可能完全破坏了驱动器。在这种情况下,第一步是重新格式化文件系统,如果失败,则更换磁盘。

诊断:高系统延迟

注意

此处描述的延迟测量特定于 HPE Helion Public Cloud。

  • 代理服务器上的坏网卡。但是,如上所述,这通常会导致峰值上升,但平均值应保持在正常参数附近。快速解决方法是关闭代理。

  • 卡住的 memcache 服务器。接受连接,但随后不会响应。预计会在 /var/log/proxy.log(端口 11211)中看到超时消息。Swift Diags 也会将其报告为失败的节点/端口。快速解决方法是关闭代理服务器。

  • 坏的/损坏的对象服务器也会导致问题,如果监视程序使用的帐户恰好位于坏的对象服务器上。

  • 数据中心的通用网络问题。将结果与 Pingdom 监视器进行比较,看看它们是否也存在问题。

诊断:接口报告错误

如果 Swift 节点上的网络接口开始报告网络错误,则可能表明存在电缆、交换机或网络问题。

使用以下命令获取接口概览

$ sudo ifconfig eth{n}
$ sudo ethtool eth{n}

如果网卡已连接电缆,则 Link Detected: 指示器将显示 yes

使用以下命令确定适配器类型

$ sudo ethtool  -i eth{n}

使用以下命令收集接口统计信息

$ sudo ethtool  -S eth{n}

如果网卡支持自检,可以使用以下命令执行自检

$ sudo ethtool  -t eth{n}

如果网卡正常运行,自检应显示 PASS

可以通过小心地卸载和重新安装模块(这避免了重新启动服务器)来重新初始化网卡模块驱动程序。例如,mellanox 驱动程序使用两部分驱动程序 mlx4_en 和 mlx4_core。要重新加载这些驱动程序,必须小心地删除 mlx4_en(以太网)然后是 mlx4_core 模块,并以相反的顺序重新安装它们。

由于在卸载模块时接口将被禁用,因此你必须非常小心不要把自己锁定在外,因此最好编写脚本。

诊断:挂起的 swift 对象复制器

复制器在其日志中报告剩余时间超过 100 小时。这可能表明 swift object-replicator 卡住且没有进展。另一种检查此情况的有用方法是在 swift 代理服务器上使用“swift-recon -r”命令

$ sudo swift-recon -r
===============================================================================

--> Starting reconnaissance on 384 hosts
===============================================================================
[2013-07-17 12:56:19] Checking on replication
[replication_time] low: 2, high: 80, avg: 28.8, total: 11037, Failed: 0.0%, no_result: 0, reported: 383
Oldest completion was 2013-06-12 22:46:50 (12 days ago) by 192.168.245.3:6200.
Most recent completion was 2013-07-17 12:56:19 (5 seconds ago) by 192.168.245.5:6200.
===============================================================================

此示例中 Oldest completion 行表明 swift 对象服务器 192.168.245.3 上的 object-replicator 尚未完成复制周期 12 天。此复制器卡住了。对象复制器周期通常小于 1 小时。虽然如果将节点添加到系统并部署了新环,则复制器周期可能为 15-20 小时。

你可以通过登录对象服务器并使用以下命令检查对象复制器进度来进一步检查对象复制器是否卡住

$ sudo grep object-rep /var/log/swift/background.log | grep -e "Starting object replication" -e "Object replication complete" -e "partitions rep"
Jul 16 06:25:46 192.168.245.4 object-replicator 15344/16450 (93.28%) partitions replicated in 69018.48s (0.22/sec, 22h remaining)
Jul 16 06:30:46 192.168.245.4object-replicator 15344/16450 (93.28%) partitions replicated in 69318.58s (0.22/sec, 22h remaining)
Jul 16 06:35:46 192.168.245.4 object-replicator 15344/16450 (93.28%) partitions replicated in 69618.63s (0.22/sec, 23h remaining)
Jul 16 06:40:46 192.168.245.4 object-replicator 15344/16450 (93.28%) partitions replicated in 69918.73s (0.22/sec, 23h remaining)
Jul 16 06:45:46 192.168.245.4 object-replicator 15348/16450 (93.30%) partitions replicated in 70218.75s (0.22/sec, 24h remaining)
Jul 16 06:50:47 192.168.245.4object-replicator 15348/16450 (93.30%) partitions replicated in 70518.85s (0.22/sec, 24h remaining)
Jul 16 06:55:47 192.168.245.4 object-replicator 15348/16450 (93.30%) partitions replicated in 70818.95s (0.22/sec, 25h remaining)
Jul 16 07:00:47 192.168.245.4 object-replicator 15348/16450 (93.30%) partitions replicated in 71119.05s (0.22/sec, 25h remaining)
Jul 16 07:05:47 192.168.245.4 object-replicator 15348/16450 (93.30%) partitions replicated in 71419.15s (0.21/sec, 26h remaining)
Jul 16 07:10:47 192.168.245.4object-replicator 15348/16450 (93.30%) partitions replicated in 71719.25s (0.21/sec, 26h remaining)
Jul 16 07:15:47 192.168.245.4 object-replicator 15348/16450 (93.30%) partitions replicated in 72019.27s (0.21/sec, 27h remaining)
Jul 16 07:20:47 192.168.245.4object-replicator 15348/16450 (93.30%) partitions replicated in 72319.37s (0.21/sec, 27h remaining)
Jul 16 07:25:47 192.168.245.4 object-replicator 15348/16450 (93.30%) partitions replicated in 72619.47s (0.21/sec, 28h remaining)
Jul 16 07:30:47 192.168.245.4 object-replicator 15348/16450 (93.30%) partitions replicated in 72919.56s (0.21/sec, 28h remaining)
Jul 16 07:35:47 192.168.245.4 object-replicator 15348/16450 (93.30%) partitions replicated in 73219.67s (0.21/sec, 29h remaining)
Jul 16 07:40:47 192.168.245.4 object-replicator 15348/16450 (93.30%) partitions replicated in 73519.76s (0.21/sec, 29h remaining)

上述状态每 5 分钟输出到 /var/log/swift/background.log

注意

“remaining”时间随着时间的推移而增加,通常剩余时间应减少。另请注意分区号。例如,15344 在几个状态行中保持不变。最终,对象复制器检测到挂起并尝试通过杀死有问题线程来取得进展。复制器然后继续到下一个分区,但通常它会再次卡在同一个分区上。

对象复制器卡住的其中一个原因是驱动器上的文件系统损坏。以下是对象复制器检测到的损坏文件系统的典型日志条目

$ sudo bzgrep "Remote I/O error" /var/log/swift/background.log* |grep srv | - tail -1
Jul 12 03:33:30 192.168.245.4 object-replicator STDOUT: ERROR:root:Error hashing suffix#012Traceback (most recent call last):#012 File
"/usr/lib/python2.7/dist-packages/swift/obj/replicator.py", line 199, in get_hashes#012 hashes[suffix] = hash_suffix(suffix_dir,
reclaim_age)#012 File "/usr/lib/python2.7/dist-packages/swift/obj/replicator.py", line 84, in hash_suffix#012 path_contents =
sorted(os.listdir(path))#012OSError: [Errno 121] Remote I/O error: '/srv/node/disk4/objects/1643763/b51'

对有问题文件或目录的 ls 通常显示如下内容

$ ls -l /srv/node/disk4/objects/1643763/b51
ls: cannot access /srv/node/disk4/objects/1643763/b51: Remote I/O error

如果在 background.log 中未出现带有 Remote I/O error 的条目,则无法确定对象复制器卡住的原因。可能是 Remote I/O error 条目早于 7 天,因此已从日志中轮换。在这种情况下,最好只是重新启动对象复制器。

  1. 停止对象复制器

    # sudo swift-init object-replicator stop
    
  2. 确保对象复制器已停止,如果它已卡住,则停止命令将无法停止卡住的进程

    # ps auxww | - grep swift-object-replicator
    
  3. 如果上一个 ps 显示对象复制器仍在运行,请杀死该进程

    # kill -9 <pid-of-swift-object-replicator>
    
  4. 启动对象复制器

    # sudo swift-init object-replicator start
    

如果上述 grep 找到了 Remote I/O error,则可能可以修复有问题的文件系统。

  1. 停止 swift 和 rsync

    # sudo swift-init all shutdown
    # sudo service rsync stop
    
  2. 确保所有 swift 进程都已停止

    # ps auxww | grep swift | grep python
    
  3. 杀死仍在运行的任何 swift 进程。

  4. 卸载有问题的文件系统

    # sudo umount /srv/node/disk4
    
  5. 修复文件系统

    # sudo xfs_repair -P /dev/sde1
    
  6. 如果 xfs_repair 失败,则可能需要重新格式化文件系统。请参阅 Procedure: Fix broken XFS filesystem。如果 xfs_repair 成功,请使用以下命令重新启用 chef,并应重新开始复制。

诊断:高 CPU 负载

如“uptime”命令所示,对象服务器上的 CPU 负载平均值通常在服务器负载轻度到中度时低于 10

$ uptime
07:59:26 up 99 days,  5:57,  1 user,  load average: 8.59, 8.39, 8.32

在活动增加期间,由于用户事务或对象复制,CPU 负载平均值可以增加到大约 30。

但是,有时 CPU 负载平均值会显著增加。以下是 CPU 负载极高的对象服务器示例

$ uptime
07:44:02 up 18:22,  1 user,  load average: 407.12, 406.36, 404.59

进一步的问题和解决方案

注意

每个 Action 列中的紧急程度级别指示是否需要立即采取行动,或者问题是否可以在工作时间内处理。

场景

描述

行动

/healthcheck 延迟很高。

/healthcheck 测试不会对代理施加很大的压力,因此任何值的下降可能与网络问题有关,而不是代理非常繁忙。非常慢的代理可能会影响平均值,但需要非常慢才能改变那么多。

检查网络。使用 curl https://<ip-address>:<port>/healthcheck,其中 ip-address 是单个代理 IP 地址。对每个代理服务器重复此操作,以查看是否可以确定问题。

紧急程度:如果还有其他迹象表明你的系统速度慢,你应该将此视为紧急问题。

Swift 进程未运行。

你可以使用 swift-init status 检查给定服务器上是否正在运行 swift 进程。

运行此命令

$ sudo swift-init all start

检查 swift 日志文件中的消息,查看自您运行 swift-init 命令以来,是否有与任何 swift 进程相关的错误消息。

采取任何看似必要的纠正措施。

紧急程度:如果这仅影响一台服务器,并且您有多台服务器,则识别和解决问题可以等到工作时间。如果相同的问题影响多台服务器,则需要立即采取纠正措施。

ntpd 未运行。

NTP 未运行。

配置并启动 NTP。

紧急程度:对于代理服务器,这至关重要。

主机时钟未与 NTP 服务器同步。

节点时间设置与 NTP 服务器时间不匹配。重启后同步可能需要一些时间。

假设 NTP 已配置并正在运行,您必须等待时间同步。

一个 swift 进程拥有数百到数千个打开的文件描述符。

可能发生在任何 swift 进程中。已知发生在 rsyslod 重启以及 /tmp 挂起时。

重启受影响节点上的 swift 进程

$ sudo swift-init all reload
紧急程度

如果已知性能问题:立即

如果系统看起来正常:中等

一个 swift 进程不属于 swift 用户。

如果 swift 用户的 UID 已更改,则进程可能不属于该 UID。

紧急程度:如果这仅影响一台服务器,并且您有多台服务器,则识别和解决问题可以等到工作时间。如果相同的问题影响多台服务器,则需要立即采取纠正措施。

对象帐户或容器文件不属于 swift。

这通常发生在服务器重新安装或重新镜像期间,swift 用户的 UID 已更改。对象帐户和容器目录中的数据文件属于原始 swift UID。因此,当前 swift 用户不拥有这些文件。

将 swift 用户的 UID 更正为与原始 UID 一致。另一种方法是更改所有文件系统上每个文件的所有权。这种替代方法通常不切实际,并且需要大量时间。

紧急程度:如果这仅影响一台服务器,并且您有多台服务器,则识别和解决问题可以等到工作时间。如果相同的问题影响多台服务器,则需要立即采取纠正措施。

一个磁盘驱动器具有较高的 IO 等待时间或服务时间。

如果单个磁盘显示较高的等待 IO 时间,则磁盘驱动器是问题所在。如果大多数/所有设备都较慢,则控制器可能是问题来源。控制器缓存也可能配置不当,这将导致类似的长时间等待或服务时间。

首先,如果您的控制器具有缓存,请检查它是否已启用,并且其电池/电容器是否正常工作。

其次,重启服务器。如果问题仍然存在,请提交 DC 工单以更换驱动器或控制器。请参阅 诊断:慢速磁盘设备,了解如何检查驱动器等待时间或服务时间。

紧急程度:中等

网络接口未启动。

使用 ifconfigethtool 命令确定网络状态。

您可以尝试重启接口。但是,通常接口(或电缆)可能已损坏,尤其是在接口上下波动的情况下。

紧急程度:如果这仅影响一台服务器,并且您有多台服务器,则识别和解决问题可以等到工作时间。如果相同的问题影响多台服务器,则需要立即采取纠正措施。

网络接口卡 (NIC) 未以预期的速度运行。

NIC 的运行速度低于其标称额定速度。例如,它以 100 Mb/s 的速度运行,而 NIC 是 1Ge NIC。

  1. 尝试使用以下命令重置接口:

    $ sudo ethtool -s eth0 speed 1000
    

    … 然后运行

    $ sudo lshw -class
    

    查看大小是否达到预期的速度。如果失败,请检查硬件(NIC 电缆/交换机端口)。

  2. 如果持续存在,请考虑关闭服务器(尤其是代理),直到问题得到识别和解决。如果您让此服务器运行,它可能会对整体性能产生很大影响。

紧急程度:高

接口 RX/TX 错误计数非零。

通常值为 0,但计数为 1 或 2 不表示有问题。

  1. 对于低数值(例如,1 或 2),您可以简单地忽略。范围在 3-30 的数字可能表明错误计数在很长一段时间内缓慢增加。考虑重启服务器以从噪声中删除报告。

    通常,当电缆或接口出现故障时,错误计数会达到 400+。例如,它很突出。可能还有其他症状,例如接口上下波动或未以正确的速度运行。具有高错误计数的服务器应受到监视。

  2. 如果错误计数继续增加,请考虑关闭服务器,直到可以对其进行适当调查。无论如何,都应进行重启以清除错误计数。

紧急程度:高,如果错误计数正在增加。

在 swift 日志中,您会看到一条消息,表明一个进程已经超过 24 小时未复制。

复制器在过去 24 小时内未成功完成一次运行。这表明复制器可能已挂起。

使用 swift-init 停止然后重启复制器进程。

紧急程度:低。但是,如果您最近添加或更换了磁盘驱动器,则应紧急处理此问题。

容器更新器未在 4 小时内运行。

该服务可能正在运行,但是,它可能已挂起。检查它们的 swift 日志,查看是否有与容器更新器相关的任何错误消息。这可能潜在地解释了为什么容器未运行。

紧急程度:中等。这可能是由最近重启 rsyslog 守护程序引起的。使用以下命令重启服务:

$ sudo swift-init <service> reload

对象复制器:报告剩余时间,并且该时间超过 100 小时。

每次复制周期,对象复制器都会将其日志记录到日志中,报告有关当前周期的统计信息。这包括估计完成所有对象复制所需的剩余时间。如果此时间超过 100 小时,则复制过程中存在问题。

紧急程度:中等。使用以下命令重启服务:

$ sudo swift-init object-replicator reload

检查剩余复制时间是否正在减少。