柳澤です。

On Thu, 12 Jul 2007 12:47:41 +0900
[メールアドレス保護] 
wrote:

> ・FreeBSDの getpwuid および getgrgid はこういうものだから、
>   user_from_uid および group_from_gid を使うのが正しい
>   →OpenSSHで対応すべき or FreeBSDの問題?

user_from_uidおよびgroup_from_gid を使うのが正しいと
lsのソースコード(*1) は示しているように思います。FreeBSD 6.2Rのls.cを
見てみましたが、 user_from_uidおよびgroup_from_gidを使う実装に
なっていて、getpwuidおよびgetgrgidは登場しません。

user_from_uidの実装を見てみましたが、内部でgetpwuidを呼んだ結果を
ダイレクトマップキャッシュしているだけでした。これより、
getpwuid一回あたりの時間が長いためにディレクトリ全部では莫大な時間が
かかってしまうということだと推測します。

> ・FreeBSDの getpwuid および getgrgid でもそんなに時間がかかるわけはな
>   いので、私のなんらかの設定がおかしい

Solarisではキャッシュするから早いのだと思います。
OpenSolarisのコード (*2) も見てみたのですが、getpwuidからは
最終的に_getpwuid_rが呼ばれ、このコードはこんな風になっています。
| struct passwd *
| _getpwuid_r(uid_t uid, struct passwd *result, char *buffer, int
(snip)
|        switch (_nsc_trydoorcall(&sptr, &ndata, &adata)) {
|         case SUCCESS:   /* positive cache hit */
|                break;
|        case NOTFOUND:  /* negative cache hit */
|                return (NULL);
|        default:
|                 return ((struct passwd *)_uncached_getpwuid_r(uid,
| result, buffer, buflen));
|        }

いつぞやのSoCの成果物にLDAPなどで解決した結果をキャッシュするのが
あったような気がするので、それを使えば速くなりそうです。

(*1) FreeBSD 6.2R /usr/src/bin/ls/ls.c
(*2) OpenSolaris 20050612 /usr/src/lib/libc/port/gen/getpwnam_r.c

-- 
-------------------------------------------------------
Yoshisato YANAGISAWA 
<[&#x30E1;&#x30FC;&#x30EB;&#x30A2;&#x30C9;&#x30EC;&#x30B9;&#x4FDD;&#x8B77;]>
Dept. of Mathematical and Computing Sciences,
Graduate School of Information Science and Engineering,
Tokyo Institute of Technology.
/* If you are an *BSD user, let's join http://bsdstats.org/ */

メールによる返信