質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

8008閲覧

ファイルディスクリプタのメモリ使用量の考え方について

yusukew62

総合スコア13

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2017/09/13 15:52

###概要

Squidのファイルディスクリプタ(FD)を増やすにあたり、
そもそもFDがどれだけメモリを使用するか気になりました。
自分なりに調査をしましたが結論が出ませんでした。
知見がある方教えてください。

###調査過程

squidのPIDを確認する。

text

1# ps auxww | grep -v grep | grep squid 2root 1398 1 0 Sep13 ? 00:00:00 squid -f /etc/squid/squid.conf 3squid 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

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2017/09/13 16:58

「Squidのファイルディスクリプタ(FD)を増やす」とは具体的にどういうことでしょうか?
yusukew62

2017/09/13 17:16

ご質問ありがとうございます。Squidが使用するFDの最大値を増やすという意味です。具体的にはプロセス起動時にulimitで"open files"の最大値を増やすことです。自分の理解ではsocket通信の開始にあたりFDの作成と参照先のメモリリソースが確保されるため、上限を引き上げる設定を反映しても即座に引き上げ分のリソースは確保されない認識です。
guest

回答1

0

ベストアンサー

ファイルディスクリプタ構造体の1エントリのサイズは数十バイトだと思います。

include/linux/fs.h

C

1struct file { 2 union { 3 struct llist_node fu_llist; 4 struct rcu_head fu_rcuhead; 5 } f_u; 6 struct path f_path; 7 struct inode *f_inode; /* cached value */ 8 const struct file_operations *f_op; 9 10 /* 11 * Protects f_ep_links, f_flags. 12 * Must not be taken from IRQ context. 13 */ 14 spinlock_t f_lock; 15 enum rw_hint f_write_hint; 16 atomic_long_t f_count; 17 unsigned int f_flags; 18 fmode_t f_mode; 19 struct mutex f_pos_lock; 20 loff_t f_pos; 21 struct fown_struct f_owner; 22 const struct cred *f_cred; 23 struct file_ra_state f_ra; 24 25 u64 f_version; 26#ifdef CONFIG_SECURITY 27 void *f_security; 28#endif 29 /* needed for tty driver, and maybe others */ 30 void *private_data; 31 32#ifdef CONFIG_EPOLL 33 /* Used by fs/eventpoll.c to link all the hooks to this file */ 34 struct list_head f_ep_links; 35 struct list_head f_tfile_llink; 36#endif /* #ifdef CONFIG_EPOLL */ 37 struct address_space *f_mapping; 38 errseq_t f_wb_err; 39}

ディスクリプタテーブルはこれ。
linux/fdtable.h

C

1/* 2 * The default fd array needs to be at least BITS_PER_LONG, 3 * as this is the granularity returned by copy_fdset(). 4 */ 5#define NR_OPEN_DEFAULT BITS_PER_LONG 6 7struct fdtable { 8 unsigned int max_fds; 9 struct file __rcu **fd; /* current fd array */ 10 unsigned long *close_on_exec; 11 unsigned long *open_fds; 12 unsigned long *full_fds_bits; 13 struct rcu_head rcu; 14};

コメントからすると、最初は小さい配列(BITS_PER_LONG)で、足りなくなれば確保し直しているのではないかと。

投稿2017/09/14 04:49

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yusukew62

2017/09/16 04:10

struct file をオブジェクト化(つまりFDの作成)する際のメモリ使用量が約数十バイト、fdtableでfile を管理されているということですね。 ご回答ありがとうございました。 頂いた情報をもとに検索したところ以下の記事にたどり着くことができ、参考になりました。 ・Linuxのファイルディスクリプタをハックする  http://qiita.com/tajima_taso/items/7e696944cb521958e63d ・ファイルディスクリプタ  http://wiki.bit-hive.com/north/pg/%A5%D5%A5%A1%A5%A4%A5%EB%A5%C7%A5%A3%A5%B9%A5%AF%A5%EA%A5%D7%A5%BF
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問