0

我们的 swift 集群有问题,使用 swift 版本 1.8.0。集群由 3 个存储节点 + 一个代理节点组成,我们有 2 次复制。每个节点都有一个 2TB SATA HDD,操作系统在 SSD 上运行。流量约为每分钟 300 个 1.3MB 文件。文件大小相同。每个文件都使用 X-expire-after 上传,其值相当于 7 天。

当我们大约 3 个月前启动集群时,我们上传的文件明显减少(~150/m),一切正常。由于我们对系统施加了更大的压力,在某一时刻,对象过期器无法像上传一样快地使文件过期,从而慢慢填满服务器。

经过我们的分析,我们发现:

  • 这不是网络问题,接口没有过载,我们没有过多的打开连接
  • 这不是CPU问题,负载很好
  • 这似乎不是 RAM 问题,我们有大约 20G 没有 64G

瓶颈似乎是磁盘,iostat 很能说明问题:

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdc               0.00    57.00    0.00  520.00     0.00  3113.00    11.97   149.18  286.21    0.00  286.21   1.92 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdc               2.00    44.00    7.00  488.00   924.00  2973.00    15.75   146.27  296.61  778.29  289.70   2.02 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdc               0.00     3.00   60.00  226.00  5136.00  2659.50    54.51    35.04  168.46   49.13  200.14   3.50 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdc               0.00     0.00  110.00   91.00  9164.00  2247.50   113.55     2.98   14.51   24.07    2.95   4.98 100.00

读写等待时间并不总是那么好:),可以达到数千毫秒,这非常可怕。

我们还看到来自节点端和代理的许多 ConnectionTimeout 消息。

来自存储节点的一些示例:

Jul 17 13:28:51 compute005 object-server ERROR container update failed with 10.100.100.149:6001/sdf (saving for async update later): Timeout (3s) (txn: tx70549d8ee9a04f74a60d69842634deb)
Jul 17 13:34:03 compute005 swift ERROR with Object server 10.100.100.153:6000/sdc re: Trying to DELETE /AUTH_698845ea71b0e860bbfc771ad3dade1/container/whatever.file: Timeout (10s) (txn: tx11c34840f5cd42fdad123887e26asdae)
Jul 17 12:45:55 compute005 container-replicator ERROR reading HTTP response from {'zone': 7, 'weight': 2000.0, 'ip': '10.100.100.153', 'region': 1, 'port': 6001, 'meta': '', 'device': 'sdc', 'id': 1}: Timeout (10s)

也来自代理:

Jul 17 14:37:53 controller proxy-server ERROR with Object server 10.100.100.149:6000/sdf re: Trying to get final status of PUT to /v1/AUTH_6988e698bc17460bbfc74ea20fdcde1/container/whatever.file: Timeout (10s) (txn: txb114c84404194f5a84cb34a0ff74e273)
Jul 17 12:32:43 controller proxy-server ERROR with Object server 10.100.100.153:6000/sdc re: Expect: 100-continue on /AUTH_6988e698bc17460bbf71ff210e8acde1/container/whatever.file: ConnectionTimeout (0.5s) (txn: txd8d6ac5abfa34573a6dc3c3be71e454f)

如果所有推送到 swift 的服务和 object-expirer 都停止了,磁盘利用率大部分时间都保持在 100%。没有 async_pending 事务,但有很多 rsyncing 正在进行,可能来自对象复制器。如果全部打开,几乎在任何给定时间都会有 30-50 个甚至更多的 async_pending 事务。

我们考虑了不同的解决方案来缓解这个问题,这基本上是结果:

  • 用于存储的 SSD 太贵了,所以不会发生
  • 将另一个 HDD 与 RAID0 集群中的每个配对(我们快速复制)
  • 使用一些缓存,例如 bcache 或 flashcache

你们有没有人遇到过这种问题?寻找根本原因的任何提示/其他地方?是否有可能优化过期器/复制器的性能?

如果需要任何其他信息,请告诉我。

谢谢

4

1 回答 1

0

我已经看到具有超过 100 万个对象的容器导致超时的问题(由于 sqlite3 db 无法获得锁定)...您可以验证您的容器对象计数吗?

于 2014-07-17T22:09:54.153 回答