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

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

ただいまの
回答率

90.46%

  • Linux

    3907questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 984

yusukew62

score 3

概要

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • otn

    2017/09/14 01:58

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

    キャンセル

  • yusukew62

    2017/09/14 02:16

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

    キャンセル

回答 1

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)で、足りなくなれば確保し直しているのではないかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/16 13: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

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Linux

    3907questions

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