鈴木と申します。

> 先日ファイルサーバを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

メールによる返信