鈴木と申します。 > 先日ファイルサーバをFreeBSD-6.1 (RELEASE)にリプレースしたところ、nfsd > がCPUを全て消費してしまう現象が発生しました。 > 最初の1〜2時間程度は重いけど、こういうものかと思っていましたが4時間後 > にはsshでのログインもできなくなりました。 > CPU Idleはほとんど0%になる状態です。 > > いろいろ調べたところ、どうもquotaがからんでいるらしいというPRを見つけ > ました。
その後該当PRについてはいつまで経っても動きがなかったのですが、MLを検索 したところ別のPRが立っていて、そちらで修正が入ったようです。 http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/98749 当方はamd64ではありませんが、特にamd64に特有とも思われなかったので該当 の修正を加えてみたところ特に問題もなくそろそろ2ヶ月になります。 参考までにMFSされた部分をパッチとして添付いたしましたので必要な方はご 利用ください。 あまり反響がない(当MLもPRの方も)のは最近は安価なNASの台頭でFreeBSDでファ イルサーバというのはあまり使わなくなってきているのでしょうか? 大学あたりだとFreeBSDを使って安価にファイルサーバを。。。というのが昔 はよくありましたが。(ディスクが大容量になったのでquota使わない??) すずき
*** sys/nfsserver/nfs_serv.c.orig Mon Mar 13 12:06:49 2006 --- sys/nfsserver/nfs_serv.c Wed Aug 2 23:46:09 2006 *************** *** 33,39 **** */ #include <sys/cdefs.h> ! __FBSDID("$FreeBSD: src/sys/nfsserver/nfs_serv.c,v 1.156.2.2 2006/03/13 03:06:49 jeff Exp $"); /* * nfs version 2 and 3 server calls to vnode ops --- 33,39 ---- */ #include <sys/cdefs.h> ! __FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/nfsserver/nfs_serv.c,v 1.156.2.3 2006/06/13 10:50:29 kib Exp $"); /* * nfs version 2 and 3 server calls to vnode ops *************** *** 569,574 **** --- 569,578 ---- error = lookup(&ind); ind.ni_dvp = NULL; + if (ind.ni_cnd.cn_flags & GIANTHELD) { + mtx_unlock(&Giant); + ind.ni_cnd.cn_flags &= ~GIANTHELD; + } if (error == 0) { /* *************** *** 1915,1920 **** --- 1919,1928 ---- error = lookup(&nd); nd.ni_dvp = NULL; + if (nd.ni_cnd.cn_flags & GIANTHELD) { + mtx_unlock(&Giant); + nd.ni_cnd.cn_flags &= ~GIANTHELD; + } if (error) goto ereply; *************** *** 2141,2146 **** --- 2149,2158 ---- error = lookup(&nd); nd.ni_dvp = NULL; + if (nd.ni_cnd.cn_flags & GIANTHELD) { + mtx_unlock(&Giant); + nd.ni_cnd.cn_flags &= ~GIANTHELD; + } if (error) goto out; *************** *** 2878,2883 **** --- 2890,2899 ---- error = lookup(&nd); nd.ni_dvp = NULL; + if (nd.ni_cnd.cn_flags & GIANTHELD) { + mtx_unlock(&Giant); + nd.ni_cnd.cn_flags &= ~GIANTHELD; + } if (error == 0) { bzero((caddr_t)fhp, sizeof(nfh)); *** sys/nfsserver/nfs_srvsubs.c.orig Wed Apr 5 00:29:51 2006 --- sys/nfsserver/nfs_srvsubs.c Wed Aug 2 23:46:09 2006 *************** *** 33,39 **** */ #include <sys/cdefs.h> ! __FBSDID("$FreeBSD: src/sys/nfsserver/nfs_srvsubs.c,v 1.136.2.2 2006/04/04 15:29:51 cel Exp $"); /* * These functions support the macros and help fiddle mbuf chains for --- 33,39 ---- */ #include <sys/cdefs.h> ! __FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/nfsserver/nfs_srvsubs.c,v 1.136.2.3 2006/06/13 10:50:29 kib Exp $"); /* * These functions support the macros and help fiddle mbuf chains for *************** *** 875,880 **** --- 875,884 ---- } if (!lockleaf) cnp->cn_flags &= ~LOCKLEAF; + if (cnp->cn_flags & GIANTHELD) { + mtx_unlock(&Giant); + cnp->cn_flags &= ~GIANTHELD; + } /* * nfs_namei() guarentees that fields will not contain garbage