ファイルディスクリプタのメモリ使用量の考え方について
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,262
概要
Squidのファイルディスクリプタ(FD)を増やすにあたり、
そもそもFDがどれだけメモリを使用するか気になりました。
自分なりに調査をしましたが結論が出ませんでした。
知見がある方教えてください。
調査過程
squidのPIDを確認する。
# ps auxww | grep -v grep | grep squid
root 1398 1 0 Sep13 ? 00:00:00 squid -f /etc/squid/squid.conf
squid 1401 1398 0 Sep13 ? 00:00:00 (squid-1) -f /etc/squid/squid.conf
サブプロセスsquid(1401)は親プロセスsquid(1398)からfolkされたため、
親プロセスのFDテーブルが複製されたため親プロセスとサブプロセスの
どちらで調査してもよい?
# pstree -p
init(1)-+-atd(1416)
(省略)
|-squid(1398)---squid(1401)
/proc/{PID}/fd/ を ls -li すると、Disk inodeが"15018"となっているが、
実態は Memory Inode "15014" へのシンボリックリンク?
# ls -li /proc/1401/fd/13
15018 lrwx------. 1 squid squid 64 9月 14 00:19 2017 13 -> socket:[15014]
ここでの IO Block 1024byte(=1KB) はシンボリックリンク自体のサイズでファイルシステム上のサイズ?
# stat /proc/1401/fd/13
File: `13' -> `socket:[15014]'
Size: 64 Blocks: 0 IO Block: 1024 シンボリックリンク
Device: 3h/3d Inode: 15018 Links: 1
Access: (0700/lrwx------) Uid: ( 23/ squid) Gid: ( 23/ squid)
Access: 2017-09-14 00:19:55.100007857 +0900
Modify: 2017-09-14 00:19:49.941010872 +0900
Change: 2017-09-14 00:19:49.941010872 +0900
ここでの IO Block 4096byte(4KB) はソケットバッファのサイズでメモリ上のサイズ?
# stat -L /proc/1401/fd/13
File: `13'
Size: 0 Blocks: 0 IO Block: 4096 ソケット
Device: 6h/6d Inode: 15014 Links: 1
Access: (0777/srwxrwxrwx) Uid: ( 23/ squid) Gid: ( 23/ squid)
Access: 1970-01-01 09:00:00.000000000 +0900
Modify: 1970-01-01 09:00:00.000000000 +0900
Change: 1970-01-01 09:00:00.000000000 +0900
カーネルパラメータでは、TCPソケットバッファのオープン時のデフォルトの値は、
受信バッファ 87,380byte、送信バッファ 16,384byte となっているが、
上記の IO Block サイズ 4096KBが正しいのか?
# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 4194304
# cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304
よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
ファイルディスクリプタ構造体の1エントリのサイズは数十バイトだと思います。
include/linux/fs.h
struct file {
union {
struct llist_node fu_llist;
struct rcu_head fu_rcuhead;
} f_u;
struct path f_path;
struct inode *f_inode; /* cached value */
const struct file_operations *f_op;
/*
* Protects f_ep_links, f_flags.
* Must not be taken from IRQ context.
*/
spinlock_t f_lock;
enum rw_hint f_write_hint;
atomic_long_t f_count;
unsigned int f_flags;
fmode_t f_mode;
struct mutex f_pos_lock;
loff_t f_pos;
struct fown_struct f_owner;
const struct cred *f_cred;
struct file_ra_state f_ra;
u64 f_version;
#ifdef CONFIG_SECURITY
void *f_security;
#endif
/* needed for tty driver, and maybe others */
void *private_data;
#ifdef CONFIG_EPOLL
/* Used by fs/eventpoll.c to link all the hooks to this file */
struct list_head f_ep_links;
struct list_head f_tfile_llink;
#endif /* #ifdef CONFIG_EPOLL */
struct address_space *f_mapping;
errseq_t f_wb_err;
} ~
ディスクリプタテーブルはこれ。
linux/fdtable.h
/*
* The default fd array needs to be at least BITS_PER_LONG,
* as this is the granularity returned by copy_fdset().
*/
#define NR_OPEN_DEFAULT BITS_PER_LONG
struct fdtable {
unsigned int max_fds;
struct file __rcu **fd; /* current fd array */
unsigned long *close_on_exec;
unsigned long *open_fds;
unsigned long *full_fds_bits;
struct rcu_head rcu;
};
コメントからすると、最初は小さい配列(BITS_PER_LONG)で、足りなくなれば確保し直しているのではないかと。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
otn
2017/09/14 01:58
「Squidのファイルディスクリプタ(FD)を増やす」とは具体的にどういうことでしょうか?
yusukew62
2017/09/14 02:16
ご質問ありがとうございます。Squidが使用するFDの最大値を増やすという意味です。具体的にはプロセス起動時にulimitで"open files"の最大値を増やすことです。自分の理解ではsocket通信の開始にあたりFDの作成と参照先のメモリリソースが確保されるため、上限を引き上げる設定を反映しても即座に引き上げ分のリソースは確保されない認識です。