Linux雑多メモ(2018/07/22)

● TZ
glibcでは、TZ環境変数は、
- なしだと"/etc/localtime"を指定したとみなされ、このファイルを探しに行く
- 空(==""を指定した)だと、"Universal"を指定したとみなされ、GMT+0に動く
となる。つまり、設定しない状態はパフォーマンス的によくない。もちろん、タイムゾーンをライブに変更しうる環境ならば、適切に設定すべき。
なお、login shellは、適切に処理をした結果として、TZ環境変数を上書きする?(詳細未確認)

● sparseなcore dump
「仮想はあるけど物理がまだない」アドレスの領域は、core dumpファイルを作るときはsparse(hole)な状態で作られる。なので、/proc/sys/kernel/core_patternに、sparseに非対応のファイルシステムだったりpipeだったりを指定するときは注意が必要。特に、sparseで吐かせたあとそのファイルを不用意にreadすると、(ext4の場合)sparseな部分もページキャッシュにのってしまうので、メモリの無駄遣いが起こる。(ext4_zero_partial_blocks()がext4_block_zero_page_range()を呼ぶくだりを参考に。) copy on right的な機能のあるFilesystemだとうまく回避しているかもしれない(未確認) ファイルを扱うときは、GNU tarのSオプションなり、cpコマンドの--sparseオプションなりをうまく使うこと。

● pipeのバッファ管理
pipeのkernel内部バッファは、デフォルトではPIPE_DEF_BUFFERS(==16)ページまでしか拡張しない。kernel/fs/pipe.cを読むこと。
pipeのバッファサイズの変更については下記が詳しい。
/proc/sys/fs/pipe-max-size - Linuxの備忘録とか・・・
(http://wiki.bit-hive.com/north/pg/%2Fproc%2Fsys%2Ffs%2Fpipe-max-size)

kernel内については下記が詳しい。
Linuxのpipeの実装を見てみる - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ
(https://kernhack.hatenablog.com/entry/2014/05/31/190317)

● pthreadのスタック
glibcのpthreadは、スレッドに割り当てるスタックはスレッドが終了しても内部でキャッシュする。allocatestack.cでallocate_stack()関数がget_cached_stack()関数を呼ぶ箇所あたりを参考に。これは下記により1プロセスあたり最大40MBまでキャッシュすることになる。

/* Maximum size in kB of cache. */
static size_t stack_cache_maxsize = 40 * 1024 * 1024; /* 40MiBi by default. */
この値はglibcをコンパイルし直さないと変更できない模様?なお、pthread_attr_setstacksize(3)でスタックサイズを、pthread_attr_setstack(3)でスタックの割当をglibcでではなく自分で行うよう、それぞれ変更できる。

● swith_rootの後処理
switch_root(8)コマンドは、mount(8)の--moveオプション(mount(2)システムコールのMS_MOVE)を行うが、その前に後処理をする。具体的には、/ にあるファイルを消しまくる。busyboxの場合はutil-linux/switch_root.cのbusybox delete_contents()を、util-linuxの場合はsys-utils/switch_root.cのrecursiveRemove()を、それぞれ見よ。

このブログ記事について

このページは、らるるが2018年6月30日 05:43に書いたブログ記事です。

ひとつ前のブログ記事は「Linux雑多メモ(2018/06/08)」です。

次のブログ記事は「Linux memo 2018/09/17」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0