real time/user CPU time/system CPU timeの違いをメモ

time(1) コマンドの出力内容 Linux で time(1) コマンドを実行すると、real time/user CPU time/system CPU timeが出力されます。 わかるような、わからないようなこの出力される時間の意味についてメモします。 各フィールドについて Real time について どの処理に時間がかかっているかはさておき、プログラムの開始から終了までを計測した時間 wall clock timeや wall time と呼ばれることもある。 User CPU time について プログラムがユーザースペースで CPU が利用された時間 ライブラリコードの実行などがここに含まれます System CPU timeについて プログラムがカーネススペースで CPU が利用された時間 システムコール(例えば disk I/O で使う read/write)の実行などがここに含まれます。 User/System CPU time が増えないケース ネットワークを介するプログラムは、通信の待ちが長いため、 CPU time を合算しても Real time よりはるかに少ない事が多いです。 sleep 処理もContinue reading “real time/user CPU time/system CPU timeの違いをメモ”

Ubuntu14.04でNFSv4を動かしてみる

ゴール nfs-server nfs-client というホスト名の Ubuntu 14.04 のサーバを2台用意し、nfs-server サーバに Network File System バージョン 4(以下 NFSv4) を構築、nfs-client サーバからマウントしてみる。 NFSv4 サーバを構築 まずは nfs-server に NFSv4 サーバを構築します。 必要なパッケージのインストール NFS サーバに必要な nfs-kernel-server パッケージをインストールします。 nfs-kernel-server は NFSv3 にも対応しているようですが、今回は NFSv4 として利用します。 共有ディレクトリを作成 次に共有ディレクトリを作成します。 今回は /tmp/no_root_squash /tmp/root_squash /etc を共有します。 ディレクトリが存在しない /tmp 以下のディレクトリを作成します。 共有ディレクトリを bind mount する NFSv3 では export するディレクトリごとに export していましたが、NFSv4 では擬似的に 1 ディレクトリにまとめ(pseudoContinue reading “Ubuntu14.04でNFSv4を動かしてみる”

bashでコマンドライン引数にファイルの中身を渡す

標準出力先としてファイル名を指定するのではなく、ファイルの中身(body)を引数として渡すにはどうすればよいのか? 実験用スクリプト 確認のため、次の簡易的なシェルスクリプトで各コマンドライン引数を表示させる。 入力ファイルとしては次のように改行やスペースを含んだ JSON ファイルを渡す 実行コマンド 結果論としては、以下のように printf と cat をコンボすればよい 解説 ポイントとなるのは次の箇所 ここを単純に $(cat test.json) や bash 方言のショートカットである $(< test.json) とすると、改行・スペースを引数の区切りとしてみなされてしまう この問題を回避するために、ファイルの中身全体を1文字列として扱うために printf ‘%s’ でラップさせるというわけ。 Reference linux – command line arguments from a file content – Stack Overflow http://stackoverflow.com/questions/4227994/command-line-arguments-from-a-file-content

[Linux]trickleを使ってプログラムごとにアドホックに帯域制御する

ネットワークの帯域制御は用途や手段に応じて様々な手段が存在する。 今回は、Linux 環境下で trickle を使ってプログラム単位でアドホックに帯域制御する方法をメモ。 trickle とは ユーザースペースで動作するトラフィックシェイパー ダイナミックローダーのプリローダー(LD_PRELOAD)を利用して socket の送受信に割り込んでトラフィックを制御 プログラム単位で制御 trickle をインストール RedHat Installation epel レポジトリからインストールする Ubuntu Installation 何も考えずに apt-get でインストールできる trickle を使う standalone mode(単一プログラムでの制御) collaborative mode(複数プログラム合算での制御) の2モードがある。 standalone mode プログラムごとにトラフィックを制御する trickle が一番得意とすると思われる用途 実行例 要は、コマンドの先頭に trickle {制御条件} を追加するだけと非常にお手軽。 -s は standalone mode を指定するオプション。 wget で実際の動きを確認してみる。(wget自体にも帯域を制御するオプションは存在するが、今回は使わない) なにも制御しなかった時 ダウンロード速度は 719K/s となっている 下りを 100KB/s に制限した時 ダウンロード速度はContinue reading “[Linux]trickleを使ってプログラムごとにアドホックに帯域制御する”

LD_PRELOADで動的ライブラリ関数を上書きする

動的リンクされたプログラムでは、同じ関数が複数のライブラリで定義されている場合、最初に見つかった関数が利用される。 環境変数 LD_PRELOAD で指定した共有ライブラリは最優先で読み込まれるため、簡単にプログラムの挙動を変えることができる。 実験用のプログラム まずは乱数を10個表示するだけの簡単なプログラム(random_num.c)を用意。 実験用プログラムの実行 コンパイルする GNU C Library(libc.so.6) とリンクされており、 実験用で利用する関数 rand もある。nm でシンボルを出力すると、 rand を確認できる。 実際に実行するとランダムに数字が10個表示される。 rand を上書きする 次に、本来はランダムな整数を返す rand 関数がつねに固定の整数 42 を返すように書き換え他プログラムを用意(unrandom.c)。 共有ライブラリとしてコンパイルする LD_PRELOAD でプログラムの実行 環境変数 LD_PRELOAD で作成した共有ライブラリ を指定し、同じプログラムを実行してみる。 rand 関数が固定値を返す自作ライブラリの関数に書き換わっているため、プログラムの実行結果もランダム性がなくなっているのがわかる。 rand を上書きする(元の関数も実行) 先ほどの例では関数の中身を完全に書き換えていたので、もう少しソフトに、本来の関数を実行しつつその前後で追加処理を入れたのが次のプログラム(myrandom.c)。 dlsym(RTLD_NEXT, “rand”) でデフォルト(RTLD_DEFAULT)の次に見つかる rand 関数を探し出し、実行している。 メッセージを出力している 箇所(printf(“custom rand is called\n”);)が追加処理。 同じようにコンパイルして実行してみる。 再びランダムな整数が表示されるようになり、また、追加したデバッグメッセージも表示されている。 References 実務家向けに必要なことはだいたいここに書かれている https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/ よりテクニカルな点は man を読むContinue reading “LD_PRELOADで動的ライブラリ関数を上書きする”

loggerコマンドの1024バイト出力制限を回避する

logger コマンドの1024バイト制限 $ cmd | logger というように、コマンドの出力結果を logger コマンド経由で syslog 出力することがある。 極稀に syslog のメッセージが途切れているという事象があり、調べてみると logger コマンドは 1024 バイトまでしか出力できないようにハードコードされているとわかる。 1024 バイト制限は “RFC 3164 : The BSD syslog Protocol” に起因していて The total length of the packet MUST be 1024 bytes or less. If the packet has been expanded beyond 1024 bytes, then the relay MUST truncate theContinue reading “loggerコマンドの1024バイト出力制限を回避する”

タイムゾーンの設定方法をメモ(RHEL6, RHEL7, Ubuntu編)

RHEL6(amazon Linux含む) RHEL7(systemd) Ubuntu の各環境でタイムゾーンを設定する方法をメモ。 RHEL6 まずは RedHat 6系の場合。 amazon ec2 のドキュメントにわかりやすい説明があるので、これを読めばOK Setting the Time for Your Linux Instance – Amazon Elastic Compute Cloud http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html タイムゾーンの一覧を取得 /usr/share/zoneinfo 以下のタイムゾーン情報から設定したいタイムゾーンを調べる 日本の場合 Japan Asia/Tokyo と複数の選択肢があるが、実体は同じ 候補の中には America/Indiana/Marengo のように Area/Location の2階層で完結しないものもあるので、タイムゾーンを操作するプログラムを書いている人は注意が必要。 ハードウェアクロック向け設定 ファイル /etc/sysconfig/clock の ZONE エントリーを先ほど決めたタイムゾーンに変更する システムクロック向け設定 システムワイドにタイムゾーン設定を管理する /etc/localtime を修正 シンボリックリンクの向き先をさきほど決めたタイムゾーンに変更する 設定を有効にする RHEL7(systemd) RHEL7 からはタイムゾーンの操作は systemd の1コマンドである timedatectlContinue reading “タイムゾーンの設定方法をメモ(RHEL6, RHEL7, Ubuntu編)”

ハードウェアクロック(RTC)についてメモ

時刻設定からの yak shaving でハードウェアクロック(リアルタイムクロック, RTC, BIOS クロック, CMOS クロック, etc) を調べたので、忘れないうちにつらつらと書いてみる。 Linux の2種類のクロック ハードウェアクロックは、マザーボード上のICによって提供される時計。電源が入っていなくても時刻を刻み続ける。Linxu では hwclock コマンドで表示できる。 システムタイムは Linux カーネル内で動作する時計。Linux では date コマンドで表示できる。 ハードウェアクロックとシステムタイム間の同期 OS 起動時にハードウェアクロックをシステムタイムに設定する。($ hwclock –hctosys) RHEL は6までは OS 停止時にシステムタイムをハードウェアクロックに同期していた。($ hwclock –systohc) 7 からは同期しなくなった。 In Red Hat Enterprise Linux 6, the hwclock command was run automatically on every system shutdown or reboot, butContinue reading “ハードウェアクロック(RTC)についてメモ”

nsenter(1)はsetns(2)のCLIインターフェース

Docker でコンテナーに入ってゴニョゴニョしたい時、昔ながらのサーバ管理よろしく sshd を起動して ssh でログインするのはコンテナーの特性を活かしておらず、筋が悪い。 WHY YOU DON’T NEED TO RUN SSHD IN YOUR DOCKER CONTAINERS http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/ Docker 1.3 以降であれば EXEC オプションを使って というようにすればよい。 Docker 1.3 より昔では util-linux の1プログラムである nsenter(“enter into namespaces” から来ているらしい) を使って コンテナーの名前空間に入れる 使い方は簡単で、コンテナーの PID を取得し、利用する名前空間を引数で指定する nsenter の実体はというと、ソースコードの冒頭のコメント nsenter(1) – command-line interface for setns(2) にあるようにシステムコール setns(2) の CLI ラッパーとわかる。 setns(2)で名前空間と戯れる Namespaces in operation,Continue reading “nsenter(1)はsetns(2)のCLIインターフェース”

[curl/wget]Content-Dispositionのファイル名でダウンロードする

HTTP のレスポンスヘッダーには Content-Disposition というフィールドがあり、クライアントにファイル保存時のファイル名を指定できる。 curl と wget で、このフィールドを参照してファイル保存する方法をメモ。 via http://superuser.com/questions/301044/how-to-wget-a-file-with-correct-name-when-redirected 実験するダウンロード用 URL 深い理由はないけれども、 次の vim スクリプトをダウンロードしたい。 HEAD メソッドでリクエストすると、Content-Disposition: attachment; filename=taglist_46.zip というようにファイル名 taglist_46.zip で保存するように仕向けている。 curl curl の -O, –remote-name オプションを使うと、URL を元に保存ファイル名が決定される。 URL から download_script.php?src_id=19574 のファイル名で保存される。 Write output to a local file named like the remote file we get. (Only the file part of the remote fileContinue reading “[curl/wget]Content-Dispositionのファイル名でダウンロードする”