Re: LOCK_SYNC_MIX state makes "getattr" operations extremely slow when there are lots of clients issue writes or reads to the same file

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 6 February 2018 at 12:19, Xuehan Xu <xxhdx1985126@xxxxxxxxx> wrote:
> Hi, everyone.
>
> Recently, in our online Luminous Cephfs clusters, we found that there
> are occasionally lots of slow requests:
>
> 2018-01-16 15:16:53.233925 7fa59f7fe700  0 log_channel(cluster) log
> [WRN] : 49 slow requests, 5 included below; oldest blocked for >
> 89.995722 secs
> 2018-01-16 15:16:53.233934 7fa59f7fe700  0 log_channel(cluster) log
> [WRN] : slow request 39.966171 seconds old, received at 2018-01-16
> 15:16:13.267686: client_request(client.4925109:3759 getattr pAsLsXsFs
> #0x10000000fe0 2018-01-16 15:16:13.176343 caller_uid=33,
> caller_gid=33{}) currently failed to rdlock, waiting
> 2018-01-16 15:16:53.233938 7fa59f7fe700  0 log_channel(cluster) log
> [WRN] : slow request 39.949899 seconds old, received at 2018-01-16
> 15:16:13.283958: client_request(client.4925109:3772 getattr pAsLsXsFs
> #0x10000000fe0 2018-01-16 15:16:13.193343 caller_uid=33,
> caller_gid=33{}) currently failed to rdlock, waiting
> 2018-01-16 15:16:53.233942 7fa59f7fe700  0 log_channel(cluster) log
> [WRN] : slow request 39.899975 seconds old, received at 2018-01-16
> 15:16:13.333882: client_request(client.4925109:3785 getattr pAsLsXsFs
> #0x10000000fe0 2018-01-16 15:16:13.242344 caller_uid=33,
> caller_gid=33{}) currently failed to rdlock, waiting
> 2018-01-16 15:16:53.233946 7fa59f7fe700  0 log_channel(cluster) log
> [WRN] : slow request 39.965588 seconds old, received at 2018-01-16
> 15:16:13.268269: client_request(client.4925109:3760 getattr pAsLsXsFs
> #0x10000000fe0 2018-01-16 15:16:13.177343 caller_uid=33,
> caller_gid=33{}) currently failed to rdlock, waiting
> 2018-01-16 15:16:53.233949 7fa59f7fe700  0 log_channel(cluster) log
> [WRN] : slow request 39.964976 seconds old, received at 2018-01-16
> 15:16:13.268881: client_request(client.4925109:3761 getattr pAsLsXsFs
> #0x10000000fe0 2018-01-16 15:16:13.178343 caller_uid=33,
> caller_gid=33{}) currently failed to rdlock, waiting
> 2018-01-16 15:16:58.233997 7fa59f7fe700  0 log_channel(cluster) log
> [WRN] : 49 slow requests, 5 included below; oldest blocked for >
> 94.995785 secs
> 2018-01-16 15:16:58.234006 7fa59f7fe700  0 log_channel(cluster) log
> [WRN] : slow request 60.080351 seconds old, received at 2018-01-16
> 15:15:58.153569: client_request(client.4925109:3742 getattr pAsLsXsFs
> #0x10000003e7d 2018-01-16 15:15:58.062900 caller_uid=99,
> caller_gid=99{}) currently failed to rdlock, waiting
> 2018-01-16 15:16:58.234010 7fa59f7fe700  0 log_channel(cluster) log
> [WRN] : slow request 44.929603 seconds old, received at 2018-01-16
> 15:16:13.304317: client_request(client.4925109:3778 getattr pAsLsXsFs
> #0x10000000fe0 2018-01-16 15:16:13.213344 caller_uid=33,
> caller_gid=33{}) currently failed to rdlock, waiting
> 2018-01-16 15:16:58.234014 7fa59f7fe700  0 log_channel(cluster) log
> [WRN] : slow request 44.964894 seconds old, received at 2018-01-16
> 15:16:13.269026: client_request(client.4925109:3762 getattr pAsLsXsFs
> #0x10000000fe0 2018-01-16 15:16:13.178343 caller_uid=33,
> caller_gid=33{}) currently failed to rdlock, waiting
> 2018-01-16 15:16:58.234017 7fa59f7fe700  0 log_channel(cluster) log
> [WRN] : slow request 44.948258 seconds old, received at 2018-01-16
> 15:16:13.285662: client_request(client.4925109:3773 getattr pAsLsXsFs
> #0x10000000fcf 2018-01-16 15:16:13.194343 caller_uid=33,
> caller_gid=33{}) currently failed to rdlock, waiting
> 2018-01-16 15:16:58.234020 7fa59f7fe700  0 log_channel(cluster) log
> [WRN] : slow request 44.817911 seconds old, received at 2018-01-16
> 15:16:13.416009: client_request(client.4925109:3796 getattr pAsLsXsFs
> #0x10000000fe0 2018-01-16 15:16:13.325347 caller_uid=33,
> caller_gid=33{}) currently failed to rdlock, waiting
>
> Our use case is like this:
>        There are one client issuing writes to a file while tens of
> other clients issue reads and stat to the same file.
>
> After a series of test, we found that these slow requests are all
> "getattr" operations, and they are all blocked by CInode::filelock in
> LOCK_SYNC_MIX state in which rdlock cannot be acquired. Further
> analysis showed that, in our use case, due tothe writing client's
> continuous "wants"  of CEPH_CAP_GWR   , nearly every "getattr"
> operation's finish would lead to the inode's filelock go into
> LOCK_SYNC_MIX state in which the mds must wait for all clients holding
> caps other than the allowed "rwl" to release their unallowed caps and
> blocks all requests to acquire "rdlock" of the inode's filelock. Due
> to the massive number of reading clients, the wait could lasts for
> about 950ms, which means, for every 950 ms, there can nearly be only
> one getattr operation gets finished.
>
> Why must the acquisition of "rdlock" of an inode's filelock be blocked
> when the inode's filelock is in LOCK_SYNC_MIX state? And why must the
> mds wait for all clients to release their unallowed caps?
>
> Thanks:-)

I've also submitted a issue for this problem:
http://tracker.ceph.com/issues/22925
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux