In our GlusterFS deployment we've encountered something like
memory
leak in GlusterFS FUSE client.
We use replicated (×2) GlusterFS volume to store mail
(exim+dovecot,
maildir format). Here is inode stats for both bricks and
mountpoint:
===
Brick 1 (Server 1):
Filesystem Inodes
IUsed
IFree IUse% Mounted on
/dev/mapper/vg_vd1_misc-lv08_mail 578768144
10954918
567813226 2% /bricks/r6sdLV08_vd1_mail
Brick 2 (Server 2):
Filesystem Inodes
IUsed
IFree IUse% Mounted on
/dev/mapper/vg_vd0_misc-lv07_mail 578767984
10954913
567813071 2% /bricks/r6sdLV07_vd0_mail
Mountpoint (Server 3):
Filesystem Inodes IUsed
IFree
IUse% Mounted on
glusterfs.xxx:mail 578767760 10954915
567812845
2% /var/spool/mail/virtual
===
glusterfs.xxx domain has two A records for both Server 1 and
Server 2.
Here is volume info:
===
Volume Name: mail
Type: Replicate
Volume ID: f564e85c-7aa6-4170-9417-1f501aa98cd2
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: server1.xxx:/bricks/r6sdLV08_vd1_mail/mail
Brick2: server2.xxx:/bricks/r6sdLV07_vd0_mail/mail
Options Reconfigured:
nfs.rpc-auth-allow: 1.2.4.0/24,4.5.6.0/24
features.cache-invalidation-timeout: 10
performance.stat-prefetch: off
performance.quick-read: on
performance.read-ahead: off
performance.flush-behind: on
performance.write-behind: on
performance.io-thread-count: 4
performance.cache-max-file-size: 1048576
performance.cache-size: 67108864
performance.readdir-ahead: off
===
Soon enough after mounting and exim/dovecot start, glusterfs
client
process begins to consume huge amount of RAM:
===
user@server3 ~$ ps aux | grep glusterfs | grep mail
root 28895 14.4 15.0 15510324 14908868 ? Ssl Sep03
4310:05
/usr/sbin/glusterfs --fopen-keep-cache
--direct-io-mode=disable
--volfile-server=glusterfs.xxx --volfile-id=mail
/var/spool/mail/virtual
===
That is, ~15 GiB of RAM.
Also we've tried to use mountpoint withing separate KVM VM
with 2
or 3
GiB of RAM, and soon after starting mail daemons got OOM
killer for
glusterfs client process.
Mounting same share via NFS works just fine. Also, we have
much less
iowait and loadavg on client side with NFS.
Also, we've tried to change IO threads count and cache size in
order
to limit memory usage with no luck. As you can see, total
cache size
is 4×64==256 MiB (compare to 15 GiB).
Enabling-disabling stat-prefetch, read-ahead and readdir-ahead
didn't
help as well.
Here are volume memory stats:
===
Memory status for volume : mail
----------------------------------------------
Brick : server1.xxx:/bricks/r6sdLV08_vd1_mail/mail
Mallinfo
--------
Arena : 36859904
Ordblks : 10357
Smblks : 519
Hblks : 21
Hblkhd : 30515200
Usmblks : 0
Fsmblks : 53440
Uordblks : 18604144
Fordblks : 18255760
Keepcost : 114112
Mempool Stats
-------------
Name HotCount ColdCount
PaddedSizeof
AllocCount MaxAlloc Misses Max-StdAlloc
---- -------- ---------
------------
---------- -------- -------- ------------
mail-server:fd_t 0 1024
108
30773120 137 0 0
mail-server:dentry_t 16110 274
84
235676148 16384 1106499 1152
mail-server:inode_t 16363 21
156
237216876 16384 1876651 1169
mail-trash:fd_t 0 1024
108
0 0 0 0
mail-trash:dentry_t 0 32768
84
0 0 0 0
mail-trash:inode_t 4 32764
156
4 4 0 0
mail-trash:trash_local_t 0 64
8628
0 0 0 0
mail-changetimerecorder:gf_ctr_local_t 0 64
16540 0 0 0 0
mail-changelog:rpcsvc_request_t 0 8
2828
0 0 0 0
mail-changelog:changelog_local_t 0 64
116
0 0 0 0
mail-bitrot-stub:br_stub_local_t 0 512
84
79204 4 0 0
mail-locks:pl_local_t 0 32
148
6812757 4 0 0
mail-upcall:upcall_local_t 0 512
108
0 0 0 0
mail-marker:marker_local_t 0 128
332
64980 3 0 0
mail-quota:quota_local_t 0 64
476
0 0 0 0
mail-server:rpcsvc_request_t 0 512
2828
45462533 34 0 0
glusterfs:struct saved_frame 0 8
124
2 2 0 0
glusterfs:struct rpc_req 0 8
588
2 2 0 0
glusterfs:rpcsvc_request_t 1 7
2828
2 1 0 0
glusterfs:log_buf_t 5 251
140
3452 6 0 0
glusterfs:data_t 242 16141
52
480115498 664 0 0
glusterfs:data_pair_t 230 16153
68
179483528 275 0 0
glusterfs:dict_t 23 4073
140
303751675 627 0 0
glusterfs:call_stub_t 0 1024
3764
45290655 34 0 0
glusterfs:call_stack_t 1 1023
1708
43598469 34 0 0
glusterfs:call_frame_t 1 4095
172
336219655 184 0 0
----------------------------------------------
Brick : server2.xxx:/bricks/r6sdLV07_vd0_mail/mail
Mallinfo
--------
Arena : 38174720
Ordblks : 9041
Smblks : 507
Hblks : 21
Hblkhd : 30515200
Usmblks : 0
Fsmblks : 51712
Uordblks : 19415008
Fordblks : 18759712
Keepcost : 114848
Mempool Stats
-------------
Name HotCount ColdCount
PaddedSizeof
AllocCount MaxAlloc Misses Max-StdAlloc
---- -------- ---------
------------
---------- -------- -------- ------------
mail-server:fd_t 0 1024
108
2373075 133 0 0
mail-server:dentry_t 14114 2270
84
3513654 16384 2300 267
mail-server:inode_t 16374 10
156
6766642 16384 194635 1279
mail-trash:fd_t 0 1024
108
0 0 0 0
mail-trash:dentry_t 0 32768
84
0 0 0 0
mail-trash:inode_t 4 32764
156
4 4 0 0
mail-trash:trash_local_t 0 64
8628
0 0 0 0
mail-changetimerecorder:gf_ctr_local_t 0 64
16540 0 0 0 0
mail-changelog:rpcsvc_request_t 0 8
2828
0 0 0 0
mail-changelog:changelog_local_t 0 64
116
0 0 0 0
mail-bitrot-stub:br_stub_local_t 0 512
84
71354 4 0 0
mail-locks:pl_local_t 0 32
148
8135032 4 0 0
mail-upcall:upcall_local_t 0 512
108
0 0 0 0
mail-marker:marker_local_t 0 128
332
65005 3 0 0
mail-quota:quota_local_t 0 64
476
0 0 0 0
mail-server:rpcsvc_request_t 0 512
2828
12882393 30 0 0
glusterfs:struct saved_frame 0 8
124
2 2 0 0
glusterfs:struct rpc_req 0 8
588
2 2 0 0
glusterfs:rpcsvc_request_t 1 7
2828
2 1 0 0
glusterfs:log_buf_t 5 251
140
3443 6 0 0
glusterfs:data_t 242 16141
52
138743429 290 0 0
glusterfs:data_pair_t 230 16153
68
126649864 270 0 0
glusterfs:dict_t 23 4073
140
20356289 63 0 0
glusterfs:call_stub_t 0 1024
3764
13678560 31 0 0
glusterfs:call_stack_t 1 1023
1708
11011561 30 0 0
glusterfs:call_frame_t 1 4095
172
125764190 193 0 0
----------------------------------------------
===
So, my questions are:
1) what one should do to limit GlusterFS FUSE client memory
usage?
2) what one should do to prevent client high loadavg because
of high
iowait because of multiple concurrent volume users?
Server/client OS is CentOS 7.1, GlusterFS server version is
3.7.3,
GlusterFS client version is 3.7.4.
Any additional info needed?