[FreeBSD-users-jp 92980] Can't fork nfsd

2010-04-19 スレッド表示 KIRIYAMA Kazuhiko
桐山です

nfsd ですが,どうも -n オプションが利かないみたいなんですが,
ソースをちょっと見たところどうも新しいカーネル(注)では全く
nfsd を産んでくれないみたいなんですが,これは仕様でしょうか?
ただ,強引に

--- /usr/src/usr.sbin/nfsd/nfsd.c.org   2009-08-03 17:13:06.0 +0900
+++ /usr/src/usr.sbin/nfsd/nfsd.c   2010-04-19 17:49:41.0 +0900
@@ -392,7 +392,7 @@
new_syscall = TRUE;
}
 
-   if (!new_syscall) {
+   if (new_syscall) {
/* If we use UDP only, we start the last server below. */
srvcnt = tcpflag ? nfsdcnt : nfsdcnt - 1;
for (i = 0; i < srvcnt; i++) {

とかやってもうまくいかないのでどうも nfssvc 自体の仕様変更に
伴なう問題かなぁと推測します.どなかた御知恵を... ;)

swap# uname -a
FreeBSD swap.cct2 8.0-RELEASE FreeBSD 8.0-RELEASE #0: Sat Nov 21 15:48:17 UTC 
2009 r...@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386
swap# ident nfsd
nfsd:
 $FreeBSD: src/lib/csu/i386-elf/crti.S,v 1.7.22.1.2.1 2009/10/25 01:10:29 
kensmith Exp $
 $FreeBSD: src/lib/csu/i386-elf/crtn.S,v 1.6.22.1.2.1 2009/10/25 01:10:29 
kensmith Exp $
 $FreeBSD: src/lib/csu/common/crtbrand.c,v 1.6.2.1.2.1 2009/10/25 01:10:29 
kensmith Exp $
 $FreeBSD: src/lib/csu/i386-elf/crt1.c,v 1.15.10.1.2.1 2009/10/25 01:10:29 
kensmith Exp $
swap# ident nfsd.c
nfsd.c:
 $FreeBSD: src/usr.sbin/nfsd/nfsd.c,v 1.38.2.1.2.1 2009/10/25 01:10:29 
kensmith Exp $
swap# 

です.

(注) new-style NFSSVC_NFSD をサポートしているやつ



[FreeBSD-users-jp 92981] Re: Can't fork nfsd

2010-04-19 スレッド表示 Hajimu UMEMOTO
  梅本です。

>>> Mon, 19 Apr 2010 18:12:02 +0900 の刻に「kiri」、すなわち
>>> KIRIYAMA Kazuhiko  氏曰く

kiri> nfsd ですが,どうも -n オプションが利かないみたいなんですが,
kiri> ソースをちょっと見たところどうも新しいカーネル(注)では全く
kiri> nfsd を産んでくれないみたいなんですが,これは仕様でしょうか?

全然気づいていませんでした。仕様でしょう。マルチプロセスではなくカーネ
ルスレッド化されているようです。

u...@himuro:~% ps axH |grep nfsd
17950  ??  S  0:00.32 nfsd: server (nfsd)
17950  ??  S  0:00.24 nfsd: server (nfsd)
17950  ??  S  0:00.20 nfsd: server (nfsd)
17950  ??  S  0:00.25 nfsd: server (nfsd)
51548  ??  Is 0:00.01 nfsd: master (nfsd)

kiri> ただ,強引に

kiri> --- /usr/src/usr.sbin/nfsd/nfsd.c.org 2009-08-03 17:13:06.0 
+0900
kiri> +++ /usr/src/usr.sbin/nfsd/nfsd.c 2010-04-19 17:49:41.0 +0900
kiri> @@ -392,7 +392,7 @@
kiri>   new_syscall = TRUE;
kiri>   }
kiri>  
kiri> - if (!new_syscall) {
kiri> + if (new_syscall) {
kiri>   /* If we use UDP only, we start the last server below. */
kiri>   srvcnt = tcpflag ? nfsdcnt : nfsdcnt - 1;
kiri>   for (i = 0; i < srvcnt; i++) {

kiri> とかやってもうまくいかないのでどうも nfssvc 自体の仕様変更に
kiri> 伴なう問題かなぁと推測します.どなかた御知恵を... ;)

ここで fork() 後に呼んでいる start_server() で、new_syscall の場合に
nfssvc() 与える構造体に nfsdcnt をセットしています。名前からしてスレッ
ド数ですね。

nfsdargs.principal = principal;
nfsdargs.minthreads = nfsdcnt;
nfsdargs.maxthreads = nfsdcnt;
error = nfssvc(nfssvc_nfsd, &nfsdargs);

-- 
梅本 肇 @ インターネット互助会横浜  http://www.imasy.org/~ume/
u...@mahoroba.org  u...@{,jp.}FreeBSD.org
プログラムは書いた人の意図ではなく書かれた通り動く  I hate Modula-3 :-)


[FreeBSD-users-jp 92982] Re: Can't fork nfsd

2010-04-19 スレッド表示 KIRIYAMA Kazuhiko
桐山です

At Mon, 19 Apr 2010 18:59:33 +0900,
Hajimu UMEMOTO wrote:
> 
> kiri> nfsd ですが,どうも -n オプションが利かないみたいなんですが,
> kiri> ソースをちょっと見たところどうも新しいカーネル(注)では全く
> kiri> nfsd を産んでくれないみたいなんですが,これは仕様でしょうか?
> 
> 全然気づいていませんでした。仕様でしょう。マルチプロセスではなくカーネ
> ルスレッド化されているようです。
> 
> u...@himuro:~% ps axH |grep nfsd
> 17950  ??  S  0:00.32 nfsd: server (nfsd)
> 17950  ??  S  0:00.24 nfsd: server (nfsd)
> 17950  ??  S  0:00.20 nfsd: server (nfsd)
> 17950  ??  S  0:00.25 nfsd: server (nfsd)
> 51548  ??  Is 0:00.01 nfsd: master (nfsd)

なるほど...

> ここで fork() 後に呼んでいる start_server() で、new_syscall の場合に
> nfssvc() 与える構造体に nfsdcnt をセットしています。名前からしてスレッ
> ド数ですね。
> 
>   nfsdargs.principal = principal;
>   nfsdargs.minthreads = nfsdcnt;
>   nfsdargs.maxthreads = nfsdcnt;
>   error = nfssvc(nfssvc_nfsd, &nfsdargs);

/usr/include/fs/nfs/nfs.h (↓) ですね

/*
 * nfsd argument for new krpc.
 */
struct nfsd_nfsd_args {
const char *principal;  /* GSS-API service principal name */
int minthreads; /* minimum service thread count */
int maxthreads; /* maximum service thread count */
};

ただ,現状は数十台のディスクレスクライアントマシンを同時に一
斉に立ち上げているのですが,以前(6.2-RELEASE-p7)に比べ驚異的
に遅くなっています(注).クライアントの方もスレッド対応にしな
いといけないということはありますか? クライアントの rc.conf
は [1] なかんじです.まぁ,6.2-RELEASE-p7 は OS はローカルで
KDE3.5に対し 8.0-STABLE の方は完全ディスクレスで KDE4.3.4
ってのはありますけど....

(注) 2〜3分(6.2-RELEASE-p7)→20〜30分(8.0-STABLE)
[1] http://www.openedu.org/~kiri/trouble/rc.conf.default