理解 OpenStack Swift (3):监控和一些影响性能的因素 [Monitoring and Performance]

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

本系列文章着重学习和研究OpenStack Swift,包括环境搭建、原理、架构、监控和性能等。

(1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 

(2)原理、架构和性能

(3)监控

 

对 Swift 集群的监控是必要的,特别是集群规模很大的时候。

1. 监控目标 

主要的监控目标包括:

  • 硬件故障
  • 操作系统故障
  • Swift 集群健康状态
  • Swift 集群状态

2. Swift 提供的工具

2.1 Swift 自带的各种 Audit 工具

2.1.1 磁盘监控工具 swift-drive-audit 

    该工具分析 /var/log/kern.log 文件,根据预定义的 regexp 来探测 kernel 报告的磁盘错误。通常地它会被 cron 周期性地运行。它使用一个配置文件,比如 /etc/swift/drive-audit.conf。如果该脚本发现了某个磁盘存在问题,它会自动 unmount 它,而且会在 /etc/fstab 中将它注释掉。然后后端 replication 进程就会从其它 replica 中拷贝出一个新的 replica。 这是示例配置文件

    要使用它,必须首先创建一个配置文件 driver-audit.conf:

复制代码
[drive-audit] 
device_dir = /srv/node 
log_facility = LOG_LOCAL0 
log_level = INFO 
minutes = 60 
error_limit = 1 
log_file_pattern = /var/log/kern* 
regex_pattern_1 = \berror\b.*\b(dm-[0-9]{1,2}\d?)\b 
复制代码

然后运行该工具:swift-drive-audit driver-audit.conf,然后上面描述的各种 action 就会有了。

2.1.2 account,container 和 object auditor

功能:

  • swift-account-auditor 会打开 account server 的 sqlite db,运行 SQL 查询,确保 db 是有效的,并报告一个account 是否有 replica 缺失或者错误的对象。
  • swift-container-auditor 会对 containers 做同样的事情.
  • swift-object-auditor 会打开一个对象服务器上的所有对象,确保它们的元数据是正确的,而且有有合适的大小和 MD5

它们都必须在各自对应的服务的配置文件中的 [account/object/container-auditor] 部分做相应配置,然后它们就会定期运行,并输出日志。

2.2 集群监控状态获取工具 swift-dispersion-populate 和 swift-dispersion-report

 这两个工具用于获取和报告集群的总体健康状态。它需要访问Swift 集群以及 Ring 文件。它需要一个自己的配置文件,往往把该配置文件放在 proxy server 上的 /etc/swift 目录下。

(1)创建配置文件 /etc/swift/dispersion.conf :

复制代码

[dispersion]

auth_url = http://controller:35357/v3
auth_user = service:swift
auth_version = 3
auth_key = 1111
swift_dir = /etc/swift
concurrency = 25
retries = 5

复制代码

该配置文件的详细说明可以参见 Ubuntu 文档。注意 Kilo 版本的 Swift 环境中需要添加配置项 auth_version。

(2)运行 swift-dispersion-populate 去获取系统的健康状况,它和 swift-dispersion-report 使用同一个配置文件。详细说明可以参见 Ubuntu 文档

root@swift1:/etc/swift# swift-dispersion-populate dispersion.conf
Created 10 containers for dispersion reporting, 0s, 0 retries
Created 10 objects for dispersion reporting, 0s, 0 retries

(3)运行  swift-dispersion-report 获取监控报告。详细说明请参加 Ubuntu 文档

复制代码
root@swift1:/etc/swift# swift-dispersion-report
Queried 11 containers for dispersion reporting, 0s, 0 retries
100.00% of container copies found (33 of 33)
Sample represents 1.07% of the container partition space
Queried 10 objects for dispersion reporting, 0s, 0 retries
There were 10 partitions missing 0 copy.
100.00% of object copies found (30 of 30)
Sample represents 0.98% of the object partition space
复制代码

2.3 性能获取工具 swift-recon 中间件

2.3.1 它是什么(what)

Swift Recon是一个安装在对象服务器的pipeline上的中间件,它有一个必填选项:一个本地缓存目录。它可以获取:

  1. How many unmounted (failed) drives there are in the cluster, and on which servers those are located
  2. How many async pendings are present
  3. Drive usage and balance
  4. Load Average (for easy access later on*)
  5. Memory Usage (for easy access later on*)
  6. Checking ring md5sum’s
  7. Logged replication stats
  8. Connection stats (tbd)
  9. Quarantine Statistics (a new pending addition)

要使用它,需要首先修改 object-server 的配置文件,添加该中间件:

复制代码
[pipeline:main]
pipeline = healthcheck recon object-server

[filter:recon]
use = egg:swift#recon
recon_cache_path = /var/cache/swift
recon_lock_path = /var/lock
复制代码

2.3.2 使用命令行工具(How)

swift-recon   <server_type>  [-v] [--suppress] [-a] [-r] [-u] [-d] [-l]  [--md5] [--auditor] [--updater] [--expirer] [--sockstat]

参数:

  • -a, --async: Get async stats
  • --auditor: Get auditor stats
  • --updater: Get updater stats
  • --expirer: Get expirer stats
  • -r, --replication: Get replication stats
  • -u, --unmounted: Check cluster for unmounted devices
  • -d, --diskusage: Get disk usage stats
  • -l, --loadstats: Get cluster load average stats
  • -q, --quarantined: Get cluster quarantine stats
  • --md5 Get md5sum of servers ring and compare to local cop
  • --all Perform all checks. Equivalent to -arudlq --md5
  • -z ZONE, --zone=ZONE: Only query servers in specified zone
  • --swiftdir=PATH Default = /etc/swift

(1)获取全部zone 上 updater,auditor 和 expier 的状态

复制代码
root@swift1:/etc/swift# swift-recon --auditor --updater --expirer
===============================================================================
--> Starting reconnaissance on 3 hosts
===============================================================================
[2015-11-14 16:52:00] Checking auditor stats
[ALL_audit_time_last_path] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[ALL_quarantined_last_path] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[ALL_errors_last_path] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[ALL_passes_last_path] low: 1, high: 1, avg: 1.0, total: 3, Failed: 0.0%, no_result: 0, reported: 3
[ALL_bytes_processed_last_path] low: 5, high: 5, avg: 5.0, total: 15, Failed: 0.0%, no_result: 0, reported: 3
[ZBF_audit_time_last_path] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[ZBF_quarantined_last_path] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[ZBF_errors_last_path] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[ZBF_bytes_processed_last_path] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
===============================================================================
[2015-11-14 16:52:00] Checking updater times
[updater_last_sweep] low: 0, high: 0, avg: 0.1, total: 0, Failed: 0.0%, no_result: 0, reported: 3
===============================================================================
[2015-11-14 16:52:00] Checking on expirers
[object_expiration_pass] - No hosts returned valid data.
[expired_last_pass] - No hosts returned valid data.
===============================================================================
复制代码

(2)磁盘使用情况

复制代码
root@swift1:/etc/swift# swift-recon -d
===============================================================================
--> Starting reconnaissance on 3 hosts
===============================================================================
[2015-11-14 16:53:38] Checking disk usage now
Distribution Graph:
  2%    2 **********************************************
  3%    3 *********************************************************************
  4%    1 ***********************
Disk usage: space used: 5343854592 of 160982630400
Disk usage: space free: 155638775808 of 160982630400
Disk usage: lowest: 2.59%, highest: 4.56%, avg: 3.31952247191%
复制代码

(3)系统负载

复制代码
root@swift1:/etc/swift# swift-recon -l
===============================================================================
--> Starting reconnaissance on 3 hosts
===============================================================================
[2015-11-14 16:54:32] Checking load averages
[5m_load_avg] low: 0, high: 0, avg: 0.1, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[15m_load_avg] low: 0, high: 0, avg: 0.1, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[1m_load_avg] low: 0, high: 0, avg: 0.1, total: 0, Failed: 0.0%, no_result: 0, reported: 3
复制代码

(4)检查所有节点上的 ring 文件和 swift.conf 是不是完全一致

复制代码
root@swift1:/etc/swift# swift-recon --md5
===============================================================================
--> Starting reconnaissance on 3 hosts
===============================================================================
[2015-11-14 17:08:38] Checking ring md5sums
3/3 hosts matched, 0 error[s] while checking hosts.
===============================================================================
[2015-11-14 17:08:38] Checking swift.conf md5sum
3/3 hosts matched, 0 error[s] while checking hosts
复制代码

2.3.2 通过 REST API 使用

URL 及功能列表:

 3. 其它监控工具

    Swift 自身带的监控工具能提供比较丰富的功能,但是使用起来还不是很方便,因此,业界已经出现了很多商业的或者开源的监控工具。这些监控工具,要么向 swift-recon 一样实现了一个新的中间件,要么调用 Swift 自身的工具提供的接口。 以下(1 - 4 部分)文字引用自 OpenStack Object Storage Monitoring 一文:

(1)Swift-Informant

    Florian Hines 开发的 Swift-Informant 中间件可以获得 OS 客户请求的实时结果。它位于proxy server的 pipeline,在每一个请求到达Proxy server之后,它发送3类统计数据到StatsD server.

  • 一个类似obj.GET.200 or cont.PUT.404的增量计数器。
  • 请求处理的时间长度
  • 传输数据数量

  这有利于了解客户正体验的服务品质,也可以了解各种服务类型,命令以及响应码的不同排列的数量。Swift-Informant也要求no change to core Swift code因为它是用中间件实现的。然而,也因为如此,它不能让人看到代理服务器后面的工作情景。如果一个存储节点的响应降低,你也可能看到你的请求变差-要么是高延迟,要么返回错误状态码。你不会知道具体是为什么,或者请求是要去哪里。或许你所考虚的container服务器是在一个好的节点的,而对象服务器是在另一个性能差的节点。
因此我们需要深入视觉到proxy server的后面,集群的操作里去。

(2)Statsdlog
Florian 的 statsdlog 工程增加了 StatsD 基于日志事件的计数器。正如Swift-Informant,它也是非侵入式的。但是statsdlog可以从Swift后台进程中追踪事件,而不仅仅是代理服务器。后台进程监听syslog信息的UDP流,当一条日志匹配于一个正则表达式时,StatsD计数器递增。Metric名字映射到JSON文件中的正则pattern。JSON文件允许灵活配置以能从日志流中抽取出想要的metrics。

(3)Swift StatsD Logging
StatsD 使用程序代码来作深入分析。Metrics被有针对性的代码实时发送。发送一个metric的开销相当低:一个sendto UDP包。如果你认为这样的开销还算高的话,StatsD client library可以只发送样本的随机比率部分,flushing metrics upstream时StatsD将估算实际数据。要避免基于中间件的监控与事后日志处理所带来的弊端,我们把StatsD metrics发送过种整合到Swift本身。我们当前所提交的更改报告了遍布15个swift后台进程的124个metrics以及tempauth中间件。metrics细节可参考https://review.openstack.org/#patch,sidebyside,6058,2,doc/source/admin_guide.rst

(4)总结

    我们认为 Swift 集群动作最好的监控方法是综合了一个通用服务器监控系统,一个Swift特定统计指标收集(polling Swift-specific gauge metrics)机制,一个Swift内部counter与timing metrics深度StatsD日志手段的结合体。对于polling Swift-specific gauge metrics,最好使用一个通用的收集插件。这个插件即可以从swift-recon读数据,也可以自己直接收集信息。在 SwiftStack,我们使用 collectd 加上一些服务器监控用 python 插件代码。我们也在collectd中嵌入StatsD服务器,这样每个节点都有一个进程将stats数据“倒”给Graphite"(http://graphite.wikidot.com/)集群。有了这个装置,我们拥有前述所有问题的全覆盖解决方案:general purpose monitoring, Swift-specific gauge monitoring, and real-time counter and timing data directly from Swift。除了图形化,你也可以实现异常检测,触发警告,维护一个实时的实体健康状态视图,避免各种突发问题。

(5)SwiftStack 监控工具的部分截图:

 

 

(6)另外一个监控环境示例

(7)Benchmarking 工具

Intel 开源了对象存储的 Benchmarking 工具 COSBench,https://github.com/intel-cloud/cosbench

4. 一些影响性能的因素

注:以下内容引用自 "Leveraging open source tools to gain insight into OpenStack Swift“ ,by Michael Factor,Dmitry Sotnikov, dmitrys@il.ibm.com。他们使用的测试环境:

4.1 Container 数量和 Swift 版本

(PUT 操作)

版本和 container 数目带来的性能差异还是非常大的。建议使用 Swift 2.2 版本以上,以及多个 container。

4.2 客户端 worker 数目

可见客户端 worker 数目不是越多性能就会线性增加。

4.3 Container 中的对象数目

4.4 前端和后端网络带宽

说明后端网络的带宽压力是前端的至少3倍。

4.5 存储节点的磁盘I/O 和前端网络 I/O 的关系(12倍)

4.6 对象大小

这说明 Swift 不合适处理大量的小文件。

4.7 IOPS 性能不是随着存储节点数目线性扩展的

也就是说这个环境中,存储节点数目为7的话,它们就不是 IOPS 性能瓶颈了。

 

参考文档:

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
存储 Swift 对象存储
OpenStack的对象存储(Swift)
【8月更文挑战第24天】
141 1
|
4月前
|
存储 JSON 监控
局域网监控软件中的Swift应用开发
在局域网监控软件中使用Swift进行应用开发,可以显著提升监控系统的性能和灵活性。Swift语言以其强大的功能和简洁的语法,成为开发高效、可靠的监控软件的不二之选。本文将通过一些代码示例,展示如何在局域网监控软件中实现Swift应用开发。
66 3
|
6月前
|
安全 Swift 开发者
【Swift开发专栏】Swift中的异步编程与性能提升
【4月更文挑战第30天】本文探讨了Swift中的异步编程,旨在提升应用性能。首先,介绍了异步编程的基本概念,强调其在处理并发任务和提高响应性中的重要性。接着,阐述了Swift中的异步模型,包括回调函数、Promises以及新引入的`async/await`和`Task`结构体。最后,讨论了通过避免主线程阻塞、合理使用线程和并发优化等策略来提升性能。Swift的异步模型为开发者提供了更简洁、安全的异步编程方式,有助于构建高效应用程序。
81 1
|
6月前
|
缓存 算法 Swift
【Swift 开发专栏】Swift 应用的性能优化技巧
【4月更文挑战第30天】本文探讨了Swift应用性能优化,强调理解性能瓶颈、针对性优化和平衡性能与代码质量的重要性。提出优化技巧,包括选择合适数据结构、避免不必要的对象创建、使用缓存、优化算法、减少计算、管理内存、利用多核处理、优化网络请求和界面渲染。通过实际案例分析证明了这些方法能有效提升应用性能和用户体验。开发者应持续关注新技术和方法,以适应不断提升的性能要求。
87 1
|
6月前
|
存储 运维 Swift
openstack cinder、swift运维命令
Cinder是OpenStack的块存储服务,提供虚拟机块设备功能,包括卷的创建、挂载等。它由cinder-api、cinder-scheduler和cinder-volume三个组件构成,前者处理请求,中间者负责调度,后者执行卷管理。Swift是OpenStack的分布式对象存储服务,高可用、持久性,适用于大文件存储。Swift架构对称,无单点故障,提供类似文件系统的简单逻辑和高效读写。Cinder关注虚拟机层面的块存储,而Swift则提供对象存储服务。命令示例展示了如何使用cinder和openstack命令操作云硬盘和Swift容器。
135 0
|
6月前
|
监控 Swift
基于Swift的局域网连接状态监视器:监控局域网内电脑
在现代的办公环境中,监视局域网内电脑的连接状态对于网络管理员来说是至关重要的。它能够帮助管理员及时发现网络问题并采取相应的措施,以确保网络的稳定性和安全性。本文将介绍如何使用Swift编写一个简单的局域网连接状态监视器,以实时监控局域网内电脑的连接状态。
256 2
|
6月前
|
监控 API Swift
用Swift开发iOS平台上的上网行为管理监控软件
在当今数字化时代,随着智能手机的普及,人们对于网络的依赖日益增加。然而,对于一些特定场景,如家庭、学校或者企业,对于iOS设备上的网络行为进行管理和监控显得尤为重要。为了满足这一需求,我们可以利用Swift语言开发一款iOS平台上的上网行为管理监控软件。
271 2
|
6月前
|
监控 Swift iOS开发
局域网计算机监控软件中利用Swift构建iOS端的移动监控应用
在局域网计算机监控软件的开发中,构建iOS端的移动监控应用是一项关键任务。本文将介绍如何利用Swift语言实现这一目标,通过多个代码示例展示关键功能的实现。
279 1
|
6月前
|
移动开发 监控 Swift
使用Swift编写电脑监控录屏软件:在macOS平台上实现
在本文中,我们将探讨如何使用Swift编写一款电脑监控录屏软件,实现在macOS平台上的功能。这个软件将能够监控用户的屏幕活动,并将录制的数据自动提交到指定的网站。我们将深入讨论代码示例,以帮助您了解实现过程。
336 0