ablog

不器用で落着きのない技術者のメモ

プロセス の検索結果:

top でプロセスが使っていたCPU番号を表示する

top を実行して、f 押して j 押せばプロセスが最後に使ったCPU番号を表示できる。フィールドの選択ができるのは知っていたけど、CPU番号があるのは知らなかった。h でヘルプは見ていたが、今までなんで気づかなかったんだろう。 top を実行して $ top f 押して j 押して、return すると P列目(右から2つ目)にCPU番号が表示される

gdb でレジスタの値を書き換えてみる

… gdb で実行中のプロセスにアタッチして、writeシステムコール発行直前でレジスタのファイルディスクリプタを書換えるというのを試してみた。 write_loop.c #include <unistd.h> int main(void) { while(1) { write(1, "foo\n", 4); } } コンパイルする $ gcc -o write_loop write_loop.c 実行する $ ./write_loop > foo.log PID を調べて、 …

Huge Page の解放について

…y or n) y プロセスがないことを確認する。 [yazekats@yazekats-linux ~]$ ps auxw|grep [h]ugepage-shm [yazekats@yazekats-linux ~]$ Huge Page は解放されていない。 [yazekats@yazekats-linux ~]$ grep -i hugepage /proc/meminfo AnonHugePages: 0 kB HugePages_Total: 200 HugePa…

prociostat.pl と visualize_prociostat.R で Linux のプロセスのボトルネックを分析する

…んが Linux のプロセスのアクティビティを追跡してグラフ化するツールを Perl + R で作られたということで早速使ってみました。 プロセスがユーザーモードでCPUを使えているのか、I/O待ちになっているのかといった傾向を分析することができます。Oracle Database はCPUを使えているのか、どんな理由で待機している(CPUを使えていない)か見ることができるよう実装されていますが、そんなものはないプログラムでも /proc ファイルシステムを参照してプログラム…

"Linuxのしくみを学ぶ - プロセス管理とスケジューリング"を読んだ

…のしくみを学ぶ - プロセス管理とスケジューリング がとてもわかりやすかった。ここまで分かりやすさと深さを両立した説明は初めて読んだ。プロセススケジューラの自分用の備忘録です。 タイマ割込みのタイミングでプロセスの切り替えが起こる Linux 2.4 のランキューは単純なリスト構造で線形探索になるので探索コストがO(n) O(1)スケジューラは優先度ごとのプロセスリストの配列になっているので計算量はO(1) CFSではプロセスが使用したCPU時間と優先度による重み付けをして昇…

HugePage は free コマンドで見ると used に計上される(2)

…Page はユーザープロセスから使われる前はOSカーネル内に確保され、used に計上されるが、ユーザプロセスが使用すると cahched に計上されるぽい。 検証結果 # ulimit -l unlimited # ulimit -l unlimited # sysctl -w vm.nr_hugepages=200 vm.nr_hugepages = 200 # sysctl vm.nr_hugepages vm.nr_hugepages = 200 # gdb huge…

iostat はどのように %util を算出しているか(3)

…コードから理解する プロセスアカウンティングのように定期的に割込み(tick)を入れて加算していくのではなく、I/Oのたびにデバイスごとに存在する構造体(hd_struct)に加算していっているというイメージで合っていそう(想定通り)。「io_ticksには前回のリクエスト完了から、今回のリクエスト完了までを加算」すると、サービスタイム(io_ticks)にデバイスでI/O処理中の時間以外も加算されてしまいそうな気がするが、ちょっと調べてみた限りではよくわからなかったので、今…

yum update したら"Another app is currently holding the yum lock; waiting for it to exit..."と怒られる

…ck を確保しているプロセスを kill する。 # ps -elf|grep yum 0 S root 3982 3625 3 80 0 - 131821 poll_s 09:28 ? 00:00:22 /usr/bin/python /usr/share/PackageKit/helpers/yum/yumBackend.py get-updates none 0 S root 4589 4470 0 80 0 - 25825 pipe_w 09:40 pts/1 00:…

gettimeofday(2) は VDSO によりユーザー空間で実行される

…及びます。 すべてのプロセスが使用するか、 またはどのプロセスも使用しないかのどちらかになります。 有効化されたら、 VDSO は gettimeofday の glibc 定義をその独自の定義でオーバーライドします。 これにより、 システムコールのオーバーヘッドが取り除かれます (コールは glibc ではなくカーネルメモリに直接行われるため)。 https://lists.openshift.redhat.com/docs/ja-JP/Red_Hat_Enterprise…

oraagent.bin が UDP で通信している

…でUDPで通信してるプロセスがいると言われて、ちょっと netstat 見てたら、oraagent.bin が UDP で通信しているのを見つけた。 $ netstat -nauep Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name (中略) udp 0 0 ::1:32154 :::* 1101 441244 8265/oraagent.bin どうでもいい…

Linux で huge page を使っているプロセスを調べる方法

…トの 4kB 以外のプロセスを探す。 調べ方の例 /proc/[pid]/smaps で KernelPageSize が 4 kB 以外のプロセスを探す。 [root@yazekats-linux ~]# perl -lane '/KernelPageSize/ and $F[1]!=4 and print qq/$ARGV\t$_/' /proc/*/smaps /proc/3834/smaps KernelPageSize: 2048 kB PID:3834 のプロセス…

オペレーティングシステムとは? なぜオペレーティングシステムを学ぶのか?

OS

… ンティング(実行中プロセスの状態を退避する)ために,OSの仮想記憶が使わ れます.OSを学ぶと,素人(失礼!)にとっては「摩訶不思議な」機能の実装 方法を理解することが出来ます. セキュリティは,オペレーティングシステムのにならず様々なソフトウェ ア(時にはハードウェア)の連携により実現されるものですが,どのような役 割分担がされていることを知ることは,将来新たな提案をするための第一歩と いえるでしょう. 並列・分散計算は,ネットワーキングやセキュリティなどの技術を組み合 …

「テキトーーク!!(TechyTalk) Vol.2 低レイヤー芸人」で話したこと

…ダウン方法 コア別、プロセス別、スレッド別、カーネル(sys,irq,soft...) or ユーザー(usr,nice...)、システムコール別、ライブラリ関数別、ユーザー関数別、 いろいろコマンドはあるが、実体はカーネルの構造体から取得している。 Oracle Database で言うと、V$→X$→共有メモリの構造体を見ているのと同じ サマリ iowait の割合が高い場合、CPU は忙しいのか暇なのか? dstat、htop、perf、crash などのコマンドの紹介…

libaio の aio コンテキスト数を調べる

…ブラリ関数がカレントプロセスの子スレッドを作る。 その子スレッドが同期な read()、write() システムコールを呼出す。 子スレッドが発行した同期I/O操作を待たずに aio_read(), aio_write() ライブラリ関数は終了する。 カーネルレベルで実現する非同期I/Oに比べて遅い。 libaio カーネルレベルの非同期I/O。 io_setup、io_submit、io_getevents、io_cancel、io_destroy システムコールを提供する…

ファイルシステムとは

OS

…を指すが、デバイスやプロセス、カーネル内の情報といったものもファイルとして提供するファイルシステムもある。 より正確に定義すれば、ファイルシステムは抽象データ型の集まりであり、ストレージ、階層構造、データの操作/アクセス/検索のために実装されたものである。ファイルシステムを特殊用途のデータベース管理システム (DBMS) と見なせるかどうかは議論があるが、ファイルシステムとデータベース管理システムには多くの共通点がある。 ファイルシステム - Wikipedia モダン オペ…

sysのCPU使用率が高い場合にその内訳を調べる方法

…perf は 特定のプロセスだけでなくOS全体の統計を見れる カーネル(sys)とユーザー(user)の両方を見れる ところが非常に便利だと思う*2。 準備 ひたすら write システムコールを発行し続けるプログラムを作成する $ cat write_loop.c #include <unistd.h> int main(void) { while(1) { write(1, "foo\n", 4); } } コンパイルする $ gcc write_loop.c -o wr…

libaioでの非同期I/O発行時にプロセスはブロックされるか

fio を実行して、 [yoheia@www****** ~]$ fio -rw=randwrite -bs=4k -size=100m -directory=/tmp -direct=1 -numjobs=2 -name=file1 -ioengine=libaio file1: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=1 file1: (g=0): rw=randwrite, …

実行中のプロセスのシェル制限を確認する

/proc//limits ってのを見つけた [yoheia@www****** ~]$ echo $$ 7292 [yoheia@www****** ~]$ cat /proc/7292/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited…

インターフェースを down するときのシステムコールを調べてみた

…を使って通信しているプロセスのソケットがクローズされると思ったが、/proc/PID/fd を観察してみたところ、down してもクローズされずにそのままだった。 [root@localhost ~]# ls -l /proc/3419/fd total 0 lr-x------ 1 oracle oracle 64 Apr 20 23:50 0 -> /dev/null l-wx------ 1 oracle oracle 64 Apr 20 23:50 1 -> /dev…

Oracle Database のサーバー・プロセスが通信する際にどのようなソケットオプションを使っているか調べる

…レースする リスナープロセスの PID を調べる。 [root@localhost ~]# ps -ef|grep [t]ns oracle 3249 1 0 19:35 ? 00:00:00 /home/oracle/app/oracle/product/11.2.0/dbhome_2/bin/tnslsnr LISTENER -inherit strace でリスナープロセスと fork されるプロセスのシステムコールをトレースする。 [root@localhost ~]…

Oracle Netトレース・ファイルを出力する

…接続する。 サーバープロセスの PID を確認する。 $ ps auxw|grep [o]racleorcl oracle 3204 0.1 6.6 621024 60600 ? Ss 07:56 0:01 oracleorcl (LOCAL=NO) トレース・ファイルのパスを確認する。 $ ls -l /proc/3204/fd total 0 lr-x------ 1 oracle oracle 64 Apr 20 08:08 0 -> /dev/null l-wx---…

パイプライン表関数

…テージングなしで次のプロセスに直接送ることができます。テーブル・ファンクションから戻されたコレクションに含まれる行を、パイプライン化することもできます。つまり、テーブル・ファンクションの入力の処理がすべて完了した後にバッチで戻すかわりに、生成されるたびに反復的に戻すことができます。 (中略) スタンドアロン・ファンクションでは、CREATE FUNCTION文にPIPELINEDオプションを指定します(構文は、「CREATE FUNCTION文」を参照してください)。パッケー…

Linux でランキュー待ち時間がCPU時間にカウントされないことを確認した

…たときにその瞬間どのプロセスがCPUを使っていたかチェックしてそのプロセスにだけCPU時間を加算してそうな気がします。 run キューで待たされた時間は CPU Time にはカウントされない - ablog と書いたが検証してみた。想定通り、ランキュー待ち時間はCPU時間に含まれなかった。 1プロセスだけ実行する。 $ time perl -e 'for(1..10000){for(1..10000){}}' real 0m5.301s user 0m3.971s sys …

/proc/[pid]/stat の各フィールドの意味

…pid]/stat プロセスの状態についての情報。 これは ps(1) で使われ、 /usr/src/linux/fs/proc/array.c で定義されている。 Man page of PROC とのことなので、Linux Kernel 2.6.18 の fs/proc/array.c を見てみると以下の通り定義されていた。 res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \ %lu %lu %lu %lu …

Oracle Database や OS の性能統計情報と財務諸表の共通点

…、CPU使用率などがプロセス起動時から現在の平均になるのも納得がいくのではないでしょうか。累計値を取得して差分や平均を算出しているという点では、top、iostat なども同じと思われます。 少し脱線すると、Linux で strace コマンドでこれらのコマンドが発行しているシステムコールを調べるとプロセスファイルシステム(/proc)にアクセスしていることがわかります。プロセスファイルシステムにはディレクトリやファイルとしてアクセスできますが、実体はカーネル空間にある性能…

LINUXカーネルHACKS

…runq コマンドはプロセススケジューラのランキューに繋がっているプロセス(実行中プロセス)を表示します。 runq コマンドだけ試してみた。 crash> runq CPU 0 RUNQUEUE: c170e780 CURRENT: PID: 13000 TASK: e8c48aa0 COMMAND: "crash" ACTIVE PRIO_ARRAY: c170ec3c [115] PID: 13000 TASK: e8c48aa0 COMMAND: "crash" PI…

Oracle Database の CPU time には割込みで使われた時間は含まれなさそう

… 3164 サーバープロセスに strace をしかける [root@localhost ~]# /usr/bin/strace -p 3164 -o strace.log Process 3164 attached - interrupt to quit SQL を実行し、SQL*Plus を終了する SQL> select count(*) from agent; COUNT(*) ---------- 10000000 SQL> exit サーバープロセスが終了して、s…

run キューで待たされた時間は CPU Time にはカウントされない

…されているか区別されていないと思うので、run キュー待ちが長くなると CPU Time が長くなる気がする。OSの実装を意識して考えないといけないですね。と思ったが、定期的に割込みが入り、コア単位でチェックしたときにその瞬間どのプロセスがCPUを使っていたかチェックしてそのプロセスにだけCPU時間を加算してそうな気がします。 追記(2014.02.17): Linux でランキュー待ち時間がCPU時間にカウントされないことを確認した - ablog に検証結果を書いてます。

strace と ptrace システムコール

… Linux には、プロセスの動作を観察できるシステムコール、ptrace が備わっています。ptraceを簡単に利用できるコマンドとしてstraceがある 詳解 Linuxカーネル 第3版作者: Daniel P. Bovet,Marco Cesati,高橋浩和,杉田由美子,清水正明,高杉昌督,平松雅巳,安井隆宏出版社/メーカー: オライリー・ジャパン発売日: 2007/02/26メディア: 大型本購入: 9人 クリック: 269回この商品を含むブログ (73件) を見るP…

性能問題の切り分け方法について考えてみる

…+ I/O待ち*3のプロセス数*4の平均値。左から1分間、5分間、15分間の平均値。この数をCPUコア数で割って2以上だと待ちが発生している*5。例えると、load average はマック*6のレジに並んでいるお客さんの行列の人数。例えば、合計でお客さん3人並んでいても、レジが3台あれば待ちは発生していないので無問題。ちなみにこの環境は2コアなので、load average の直近1分間の平均が 3.78 は結構重い状態。2コアとも常に処理を実行中で1プロセスが待ちの状態が…