<html><head><meta http-equiv="Content-Type" content="text/html charset=GB2312"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi Avati,<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>It seem no use with your suggestion to&nbsp;remove entries for page size less than 4KB(even 4KB), the RES also increased with smbd.</div><div><br></div><div><br></div><div>Thanks</div><div>-Kane</div><div><br><div><div>在 2013-9-25,上午10:12,Anand Avati &lt;<a href="mailto:avati@gluster.org">avati@gluster.org</a>&gt; 写道:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">On Tue, Sep 24, 2013 at 6:37 PM, haiwei.xie-soulinfo <span dir="ltr">&lt;<a href="mailto:haiwei.xie@soulinfo.com" target="_blank">haiwei.xie@soulinfo.com</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">hi,<br>
<br>
&nbsp; &nbsp;Our patch for this bug, &nbsp;running looks good. smbd will not exit with oom-kill. But it's not correct method.<br>
<br>
git version: release-3.4/886021a31bdac83c2124d08d64b81f22d82039d6<br>
<br>
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c<br>
index 66e7d69..535ee53 100644<br>
--- a/api/src/glfs-fops.c<br>
+++ b/api/src/glfs-fops.c<br>
@@ -713,7 +713,9 @@ glfs_pwritev (struct glfs_fd *glfd, const struct iovec *iovec, int iovcnt,<br>
&nbsp; &nbsp; &nbsp; &nbsp; }<br>
<br>
&nbsp; &nbsp; &nbsp; &nbsp; size = iov_length (iovec, iovcnt);<br>
-<br>
+#define MIN_LEN 8 * 1024<br>
+ &nbsp; &nbsp; &nbsp; if (size &lt; MIN_LEN)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size = MIN_LEN;<br>
&nbsp; &nbsp; &nbsp; &nbsp; iobuf = iobuf_get2 (subvol-&gt;ctx-&gt;iobuf_pool, size);<br>
&nbsp; &nbsp; &nbsp; &nbsp; if (!iobuf) {<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret = -1;<br>
<div><div class="h5"><br></div></div></blockquote><div><br></div><div><br></div><div>Ah, looks like we need to tune the page_size/num_pages table in libglusterfs/src/iobuf.c. The table is allowing for too small pages. We should probably remove entries for page size less than 4KB. Just doing that might fix your issue:</div>
<div><br></div><div><pre style="">diff --git a/libglusterfs/src/iobuf.c b/libglusterfs/src/iobuf.c
index a89e962..0269004 100644
--- a/libglusterfs/src/iobuf.c
+++ b/libglusterfs/src/iobuf.c
@@ -24,9 +24,7 @@
 /* Make sure this array is sorted based on pagesize */
 struct iobuf_init_config gf_iobuf_init_config[] = {
         /* { pagesize, num_pages }, */
-        {128, 1024},
-        {512, 512},
-        {2 * 1024, 512},
+        {4 * 1024, 256},
         {8 * 1024, 128},
         {32 * 1024, 64},
         {128 * 1024, 32},</pre></div><div><br></div><div>Avati</div><div><br></div><div>&nbsp;</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div><div class="h5">
&gt; On 09/13/2013 06:03 PM, kane wrote:<br>
&gt; &gt; Hi<br>
&gt; &gt;<br>
&gt; &gt; We use samba gluster vfs in IO test, but meet with gluster server smbd<br>
&gt; &gt; oom killer,<br>
&gt; &gt; The smbd process spend over 15g RES with top command show, in the end<br>
&gt; &gt; is our simple test code:<br>
&gt; &gt;<br>
&gt; &gt; gluster server vfs --&gt; smbd --&gt; client mount dir "/mnt/vfs"--&gt; execute<br>
&gt; &gt; vfs test program "$ ./vfs 1000"<br>
&gt; &gt;<br>
&gt; &gt; then we can watch gluster server smbd RES with top command.<br>
&gt; &gt;<br>
&gt; &gt; PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND<br>
&gt; &gt; 4000 soul 20 0 5486m 4.9g 10m R 108.4 31.5 111:07.07 smbd<br>
&gt; &gt; 3447 root 20 0 1408m 44m 2428 S 44.4 0.3 59:11.55 glusterfsd<br>
&gt; &gt;<br>
&gt; &gt; io test code:<br>
&gt; &gt; =======================================<br>
&gt; &gt; #define _LARGEFILE64_SOURCE<br>
&gt; &gt;<br>
&gt; &gt; #include &lt;stdio.h&gt;<br>
&gt; &gt; #include &lt;unistd.h&gt;<br>
&gt; &gt; #include &lt;string.h&gt;<br>
&gt; &gt; #include &lt;pthread.h&gt;<br>
&gt; &gt; #include &lt;stdlib.h&gt;<br>
&gt; &gt; #include &lt;fcntl.h&gt;<br>
&gt; &gt; #include &lt;sys/types.h&gt;<br>
&gt; &gt;<br>
&gt; &gt; int WT = 1;<br>
&gt; &gt;<br>
&gt; &gt; #define RND(x) ((x&gt;0)?(genrand() % (x)):0)<br>
&gt; &gt; extern unsigned long genrand();<br>
&gt; &gt; extern void sgenrand();<br>
&gt; &gt;<br>
&gt; &gt; /* Period parameters */<br>
&gt; &gt; #define N 624<br>
&gt; &gt; #define M 397<br>
&gt; &gt; #define MATRIX_A 0x9908b0df /* constant vector a */<br>
&gt; &gt; #define UPPER_MASK 0x80000000 /* most significant w-r bits */<br>
&gt; &gt; #define LOWER_MASK 0x7fffffff /* least significant r bits */<br>
&gt; &gt;<br>
&gt; &gt; /* Tempering parameters */<br>
&gt; &gt; #define TEMPERING_MASK_B 0x9d2c5680<br>
&gt; &gt; #define TEMPERING_MASK_C 0xefc60000<br>
&gt; &gt; #define TEMPERING_SHIFT_U(y) (y &gt;&gt; 11)<br>
&gt; &gt; #define TEMPERING_SHIFT_S(y) (y &lt;&lt; 7)<br>
&gt; &gt; #define TEMPERING_SHIFT_T(y) (y &lt;&lt; 15)<br>
&gt; &gt; #define TEMPERING_SHIFT_L(y) (y &gt;&gt; 18)<br>
&gt; &gt;<br>
&gt; &gt; static unsigned long mt[N]; /* the array for the state vector */<br>
&gt; &gt; static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */<br>
&gt; &gt;<br>
&gt; &gt; /* Initializing the array with a seed */<br>
&gt; &gt; void<br>
&gt; &gt; sgenrand(seed)<br>
&gt; &gt; unsigned long seed;<br>
&gt; &gt; {<br>
&gt; &gt; int i;<br>
&gt; &gt;<br>
&gt; &gt; for (i=0;i&lt;N;i++) {<br>
&gt; &gt; mt[i] = seed &amp; 0xffff0000;<br>
&gt; &gt; seed = 69069 * seed + 1;<br>
&gt; &gt; mt[i] |= (seed &amp; 0xffff0000) &gt;&gt; 16;<br>
&gt; &gt; seed = 69069 * seed + 1;<br>
&gt; &gt; }<br>
&gt; &gt; mti = N;<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; unsigned long<br>
&gt; &gt; genrand()<br>
&gt; &gt; {<br>
&gt; &gt; unsigned long y;<br>
&gt; &gt; static unsigned long mag01[2]={0x0, MATRIX_A};<br>
&gt; &gt; /* mag01[x] = x * MATRIX_A for x=0,1 */<br>
&gt; &gt;<br>
&gt; &gt; if (mti &gt;= N) { /* generate N words at one time */<br>
&gt; &gt; int kk;<br>
&gt; &gt;<br>
&gt; &gt; if (mti == N+1) /* if sgenrand() has not been called, */<br>
&gt; &gt; sgenrand(4357); /* a default initial seed is used */<br>
&gt; &gt;<br>
&gt; &gt; for (kk=0;kk&lt;N-M;kk++) {<br>
&gt; &gt; y = (mt[kk]&amp;UPPER_MASK)|(mt[kk+1]&amp;LOWER_MASK);<br>
&gt; &gt; mt[kk] = mt[kk+M] ^ (y &gt;&gt; 1) ^ mag01[y &amp; 0x1];<br>
&gt; &gt; }<br>
&gt; &gt; for (;kk&lt;N-1;kk++) {<br>
&gt; &gt; y = (mt[kk]&amp;UPPER_MASK)|(mt[kk+1]&amp;LOWER_MASK);<br>
&gt; &gt; mt[kk] = mt[kk+(M-N)] ^ (y &gt;&gt; 1) ^ mag01[y &amp; 0x1];<br>
&gt; &gt; }<br>
&gt; &gt; y = (mt[N-1]&amp;UPPER_MASK)|(mt[0]&amp;LOWER_MASK);<br>
&gt; &gt; mt[N-1] = mt[M-1] ^ (y &gt;&gt; 1) ^ mag01[y &amp; 0x1];<br>
&gt; &gt;<br>
&gt; &gt; mti = 0;<br>
&gt; &gt; }<br>
&gt; &gt; y = mt[mti++];<br>
&gt; &gt; y ^= TEMPERING_SHIFT_U(y);<br>
&gt; &gt; y ^= TEMPERING_SHIFT_S(y) &amp; TEMPERING_MASK_B;<br>
&gt; &gt; y ^= TEMPERING_SHIFT_T(y) &amp; TEMPERING_MASK_C;<br>
&gt; &gt; y ^= TEMPERING_SHIFT_L(y);<br>
&gt; &gt;<br>
&gt; &gt; return y;<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; char *initialize_file_source(int size)<br>
&gt; &gt; {<br>
&gt; &gt; char *new_source;<br>
&gt; &gt; int i;<br>
&gt; &gt;<br>
&gt; &gt; if ((new_source=(char *)malloc(size))==NULL) /* allocate buffer */<br>
&gt; &gt; fprintf(stderr,"Error: failed to allocate source file of size %d\n",size);<br>
&gt; &gt; else<br>
&gt; &gt; for (i=0; i&lt;size; i++) /* file buffer with junk */<br>
&gt; &gt; new_source[i]=32+RND(95);<br>
&gt; &gt;<br>
&gt; &gt; return(new_source);<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; void *tran_file(void *map)<br>
&gt; &gt; {<br>
&gt; &gt; int block_size = 512;<br>
&gt; &gt; char *read_buffer; /* temporary space for reading file data into */<br>
&gt; &gt; int fd = open((char *)map, O_RDWR | O_CREAT | O_TRUNC, 0644);<br>
&gt; &gt; if(fd == -1) {<br>
&gt; &gt; perror("open");<br>
&gt; &gt; return ;<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; //read_buffer=(char *)malloc(block_size);<br>
</div></div>&gt; &gt; //memset(read_buffer, 0x56, block_size);<br>
<div><div class="h5">&gt; &gt; read_buffer = initialize_file_source(block_size);<br>
&gt; &gt; while(WT){<br>
&gt; &gt; sleep(1);<br>
&gt; &gt; pwrite(fd, read_buffer, block_size, 0);<br>
&gt; &gt; pread(fd, read_buffer, block_size, 0);<br>
&gt; &gt; }<br>
&gt; &gt; free(read_buffer);<br>
&gt; &gt; close(fd);<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; int main(int argc, char *argv[])<br>
&gt; &gt; {<br>
&gt; &gt; if(argc == 1) {<br>
&gt; &gt; printf("Set file name and file size in GB!\n");<br>
&gt; &gt; return -1;<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; unsigned long long length = atoll(argv[1]) * 1024 * 1024 * 1024;<br>
&gt; &gt; unsigned long long index = 0;<br>
&gt; &gt; unsigned long long count = 0;<br>
&gt; &gt; int fd = 0;<br>
&gt; &gt; char path[32];<br>
&gt; &gt; char *swap = NULL;<br>
&gt; &gt; int psize = 65536;<br>
&gt; &gt; int ret = 0;<br>
&gt; &gt; int ret_i = 0;<br>
&gt; &gt; void *tret;<br>
&gt; &gt; pthread_t rtid_1;<br>
&gt; &gt; pthread_t rtid_2;<br>
&gt; &gt; pthread_t rtid_3;<br>
&gt; &gt; pthread_t rtid_4;<br>
&gt; &gt; int fd_i = 0;<br>
&gt; &gt; int a_size = 256;<br>
&gt; &gt; char *append_buffer; /* temporary space for reading file data into */<br>
&gt; &gt;<br>
&gt; &gt; swap = (char *)malloc(sizeof(char) * psize);<br>
&gt; &gt; if(swap == NULL) {<br>
&gt; &gt; printf("Malloc Swap Failed!\n");<br>
&gt; &gt; close(fd);<br>
&gt; &gt; return -1;<br>
&gt; &gt; }<br>
&gt; &gt; memset(swap, 0x55, psize);<br>
&gt; &gt;<br>
&gt; &gt; append_buffer = initialize_file_source(a_size);<br>
&gt; &gt;<br>
&gt; &gt; pthread_create(&amp;rtid_1, NULL, tran_file, "/mnt/vfs/a.map");<br>
&gt; &gt; pthread_create(&amp;rtid_2, NULL, tran_file, "/mnt/vfs/b.map");<br>
&gt; &gt; pthread_create(&amp;rtid_3, NULL, tran_file, "/mnt/vfs/c.map");<br>
&gt; &gt; pthread_create(&amp;rtid_4, NULL, tran_file, "/mnt/vfs/d.map");<br>
&gt; &gt;<br>
&gt; &gt; while(index &lt; length)<br>
&gt; &gt; {<br>
&gt; &gt; if((index % (1024*1024*1024)) == 0) {<br>
&gt; &gt; count++;<br>
&gt; &gt; sprintf(path, "/mnt/vfs/data/%08lld.dat", count);<br>
&gt; &gt; if((fd = open(path, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) &lt; 0)<br>
&gt; &gt; {<br>
&gt; &gt; printf("Can not open io file: %s\n", path);<br>
&gt; &gt; perror("open");<br>
&gt; &gt; return -1;<br>
&gt; &gt; }<br>
&gt; &gt; sprintf(path, "/mnt/vfs/data/%08lld.index", count);<br>
&gt; &gt; if((fd_i = open(path, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR))<br>
&gt; &gt; &lt; 0)<br>
&gt; &gt; {<br>
&gt; &gt; printf("Can not open io file: %s\n", path);<br>
&gt; &gt; perror("open");<br>
&gt; &gt; return -1;<br>
&gt; &gt; }<br>
&gt; &gt; printf("...1GiB\n");<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; ret = pwrite(fd, swap, psize, (index % (1024*1024*1024)));<br>
&gt; &gt; if(ret != psize) {<br>
&gt; &gt; perror("write");<br>
&gt; &gt; printf("Write data file failed!\n");<br>
&gt; &gt; continue;<br>
&gt; &gt; }<br>
&gt; &gt; lseek64(fd_i, ((index*a_size)/65536), SEEK_SET);<br>
&gt; &gt; ret_i = write(fd_i, append_buffer, a_size);<br>
&gt; &gt; if(ret_i != a_size) {<br>
&gt; &gt; perror("write");<br>
&gt; &gt; printf("Write index file failed!\n");<br>
&gt; &gt; continue;<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; index += ret;<br>
&gt; &gt; if((index % (1024*1024*1024)) == 0) {<br>
&gt; &gt; close(fd);<br>
&gt; &gt; close(fd_i);<br>
&gt; &gt; }<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; WT = 0;<br>
&gt; &gt; pthread_join(rtid_1, &amp;tret);<br>
&gt; &gt; pthread_join(rtid_2, &amp;tret);<br>
&gt; &gt; pthread_join(rtid_3, &amp;tret);<br>
&gt; &gt; pthread_join(rtid_4, &amp;tret);<br>
&gt; &gt; printf("%s GB write\n", argv[1]);<br>
&gt; &gt; sync();<br>
&gt; &gt; free(swap);<br>
&gt; &gt; free(append_buffer);<br>
&gt; &gt;<br>
&gt; &gt; return 0;<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; =======================================<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; kane<br>
&gt; &gt; ----------------------------------------------------------------<br>
</div></div>&gt; &gt; Email: <a href="mailto:kai.zhou@soulinfo.com">kai.zhou@soulinfo.com</a> &lt;mailto:<a href="mailto:kai.zhou@soulinfo.com">kai.zhou@soulinfo.com</a>&gt;<br>
<div class=""><div class="h5">&gt; &gt; 电话: 0510-85385788-616<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; Thanks for the code. I will try to reproduce the issue using your code.<br>
&gt;<br>
&gt; -Lala<br>
<br>
<br>
</div></div><span class=""><font color="#888888">--<br>
谢海威<br>
软件项目经理<br>
电话: &nbsp;<a href="tel:%2B86%2010-68920588" value="+861068920588">+86 10-68920588</a><br>
手机: &nbsp;<a href="tel:%2B86%2013911703586" value="+8613911703586">+86 13911703586</a><br>
Email: &nbsp;<a href="mailto:haiwei.xie@soulinfo.com">haiwei.xie@soulinfo.com</a><br>
<br>
_______________________________________________<br>
Gluster-devel mailing list<br>
<a href="mailto:Gluster-devel@nongnu.org">Gluster-devel@nongnu.org</a><br>
<a href="https://lists.nongnu.org/mailman/listinfo/gluster-devel" target="_blank">https://lists.nongnu.org/mailman/listinfo/gluster-devel</a><br>
</font></span></blockquote></div><br></div></div>
</blockquote></div><br></div></body></html>