ablog

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

プロセス の検索結果:

プロセス別の PTE は /proc/[pid]/status の VmPTE で確認できる

$ cat /proc/1741/status Name: bash State: S (sleeping) Tgid: 1741 Pid: 1741 PPid: 1740 TracerPid: 0 Uid: 1200 1200 1200 1200 Gid: 54321 54321 54321 54321 FDSize: 256 Groups: 54321 54322 54323 54324 54325 54326 54327 VmPeak: 108516 kB VmSize…

strace の -y や -yy でFD番号と共にファイルパスやIPアドレス・ポート番号を表示する

…ace を使う場合、プロセスが起動している間に lsof や /proc/[pid]/fd でファイルディスクリプタ(FD)番号とファイルパスの対応を確認しておかないと、read(17, ... などと出力されている場合に、17 のファイルパスがわからなくなりますが*1、 strace 4.7 (2012年5月リリース) から -y でFD番号と対応するファイルパス Noteworthy changes in release 4.7 =====================…

よく使う strace のオプション

…クロ秒) ff: 子プロセスのシステムコールもトレースし、-o との併用でプロセス(スレッド)毎に別ファイルに出力 o: 指定したファイル名に出力。-ff と併用すると、ファイル名. に出力 s: 出力文字数を指定。デフォルト32文字。read/write システムコールなどで読み書きした内容を全て確認したい場合は、大きくする。 p: プロセスIDを指定。 $ strace -Ttt -ff -s 1500000 -o <ログ出力先ファイル名> -p <PID> もしくは $…

perf-map-agent で Java のプロセスにアタッチすると AttachNotSupportedException が発生する

…t で Java のプロセスにアタッチすると "Unable to open socket file: target process not responding or HotSpot VM not loaded" というエラーが発生する。 Java を実行する。 $ java ... 別セッションで perf-map-agent で実行中の Java のプロセスにアタッチする。 $ ps -ef|grep java $ java -cp attach-main.jar:$J…

Java Mixed-Mode Flame Graphs で Java の CPU ネックをフルスタックで分析する

…使うと Java のプロセスが CPU ネックのケースで、Java アプリケーションコード、JVM(HotSpot VM)、Linux Kernel のどのレイヤーのどの関数がボトルネックになっているかを簡単に特定することができます。 以下は GitHub - martint/jittest: Demonstrate JIT compiler issue in java 7 のワークロードを実行して Flame Graphs で可視化したものです。 以下は Java One …

実行中のマルチスレッドプログラムの特定スレッドのみ停止(SIGSTOP的な)させる方法

…p 3449-> LWP:3449 のステータスが t になりました— yohei-a (@yoheia) 2016年3月29日@yoheia gdb -iex="set non-stop on" -iex="set target-async on" -p プロセス して cont -a してから特定プロセスを interrupt してもいいですね。こちらのほうが自由にスレッド間を行き来できていいかも。— Tsukasa Hamano (@hamano) 2016年3月29日

Oracle GoldenGate 12.1.2.0.0 を使ってみる

…i manager プロセスおよび子プロセスに strace をしかける。 [oracle@ODIGettingStarted strace]$ ps -elf|grep ./[m]gr 0 S oracle 8243 1 0 80 0 - 168275 poll_s 20:10 ? 00:00:33 ./mgr PARAMFILE /u01/Middleware/OGG_Source/dirprm/mgr.prm REPORTFILE /u01/Middleware/OGG…

NFS on Linux でロックを解放する方法

…ロックを保持しているプロセスのPID 6. ロック対象ファイル(ファイルシステムのメジャー、マイナデバイスID、i-node番号) 7. ロック範囲バイト(flock()によるロックの場合は常に0) 8. ロック範囲終了バイト 参考 Fcntl - load the C Fcntl.h defines - metacpan.org File::FcntlLock - File locking with fcntl(2) - metacpan.org fcntl(2) - Li…

シンプルでシステマチックな Linux 性能分析(本)

…に起こっていること プロセススケジューラ/IOスケジューラ/仮想記憶(ページング)/ファイルシステム/ブロックデバイス/キャラクタデバイス/スワップ システムコール/割込み/コンテキストスイッチ メモリ空間(ユーザー空間とカーネル空間) 理論 待ち行列理論 アムダールの法則 Timeベース 同期/非同期、直列/並列、ピンポン、固定長と可変長、排他制御 ボトルネックの見つけ方 CPU CPU使用率とランキュー メモリ 実質メモリ使用率を算出する メモリ使用率の内訳 スワップを正…

Oracle Linux 6 on OracleVM では gettimeofday が vDSO でない

…)(゚) ★LGWRプロセスのシステムコールを確認 cat lgwr_strace_async_true.log.5657 : gettimeofday({1448245846, 974961}, NULL) = 0 io_submit(139669291659264, 1, {{data:0x7f07479db320, pwrite, filedes:258, … ★ gettimeofday({1448245846, 975302}, NULL) = 0 io_getev…

OOM Killer について

RHEL4 は vm.oom-kill=0 で無効化できる RHEL5(kernel 2.6.11) 以降はプロセス単位のみ制御可能(echo -17 > /proc/[pid]/oom_adj) RHEL7(kernel 2.6.36) 以降は echo -1000 > /proc/[pid]/oom_score_adj proc(5) - Linux manual page

DBサーバの空きメモリサイズの見方(Oracle Database on Linux)

… … カーネル + プロセス + ipcs -um の pages resident * 4KB(ページサイズ、HugePages使用時は2MB) … System V IPC 共有メモリ + df -k の tmpfs の Used … tmpfs/ramfs (MEMORY_TARGET使用時) ) RHEL/Oracle Linux 6 空きメモリサイズ = /proc/meminfo の MemFree + Active(file) + Inactive(file) …

Linux のページ回収まわりのカーネルパラメータ

…12MB を下回るとプロセスがメモリ要求時に同期でページ回収が実行される(direct reclaim)。 kernel 3.5 以降なら、vm.extra_free_kbytes を設定して、low pages、high pages に 1GB 加算し direct reclaim が発生しにくくする。 メモリ使用率監視閾値(アラート)が 90% なら、low pages がメモリの 10%+α くらいにすると良さげな気がする。 と Solaris テイストになりました。 …

JPOUG> SET EVENTS 20151017 に参加しました

…inux カーネルのプロセススケジューラのスケジューリングが関係していました。詳しくは ”私の環境で”大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由 - ablog をご覧ください。 オススメ本 畔勝さん:深い情報は意外と本を見たほうが早かったりする。ネットで調べてもあるかもしれないが、本でわかりやすく書かれていてすぐ解決してしまうことが #JPOUG— 傳智之 (@dentomo) 2015, 10月 17とお話したので、オススメ本を紹介します。「…

NFSでI/Oシステムコール発行後に応答がない場合、プロセスを kill できるか

… hard がある。プロセスがI/Oシステムコールを発行してユーザーモードからカーネルモードにコンテキストスイッチした後、応答がないと、soft の場合はリトライを繰返した後にI/Oエラーになるが、hard の場合は応答があるまで待ち続ける。 hard + intr: kill できる*1。おそらく TASK_INTERRUPTIBLE でスリープするため。 hard + nointr: kill できない。おそらく TASK_UNINTERRUPTIBLE でスリープするた…

vm.min_free_kbytes からの wmark_{min|low|high} 算出式

…es) 未満になるとプロセスがメモリを割当を要求するとページ回収して空きを作ってから割当られる。 Systems Performance: Enterprise and the Cloud Figure - 7.8 kswapd wake-ups and modes より Reducing Memory Access Latency より 参考情報 Page frame management from siburu Page reclaim from siburu Profe…

"Reducing Memory Access Latency" が素晴らしすぎる

…ャッシュがあるうちはプロセスのメモリ(anon page)をスワップアウトしないようにできる*1。 swappines=0 にしても 解放可能なページキャッシュがあるのにプロセスのメモリがスワップアウトされる問題があったが、この資料を書いた守屋さんのパッチが Kernel 3.5 にマージされている → mm: avoid swapping out with swappiness==0 extra_free_kbytes で kswapd がページ回収を開始する閾値を上げ、d…

Linux のページテーブルのサイズの見方と見積式

…kB ★ 34MB プロセス毎のページテーブルのサイズ $ cat /proc/10225/status # 10255 は PID Name: zsh State: S (sleeping) Tgid: 10225 Pid: 10225 PPid: 10222 (中略) VmPTE: 124 kB ★ 124KB ページテーブルのサイズの見積式 見積式 (プロセスが使用している物理メモリサイズ / 4KB(ページサイズ)) * 8bytes正確には、PTE は 8bytes…

pgrep で子プロセスの PID を調べる

子プロセスの PID を取得したい場合、人間が見るには pstree が便利だけど、 $ pstree -alp $$ zsh,13840 ├─pstree,14216 -alp 13840 ├─zsh,13940 │ └─sleep,14213 10 └─zsh,13992 └─sleep,14215 10 シェルスクリプトで子プロセスの PID を取得して何か自動処理したいときには pgrep が便利そう。 P: 親プロセスの PID を指定 d: デリミタを指定 $ p…

プロセスのランキュー待ち時間とI/O待ち時間を調べる

…取得します。catのプロセスと awk のプロセスが並列実行されている期間があるため、実行時間 (中略) 大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由 - ablog と書きましたが、プロセスの ランキュー待ち時間は /proc//sched の2列目(sched_info.run_delay) I/O待ち時間は /proc//schedstat の se.statistics.iowait_sum で調べることができます(たぶん)。 Brenda…

”私の環境で”大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由

…のか調べてみました。プロセススケジューラが関係しているようです。 ↑はPerf + Flame Graphs で、awk file > file 実行時のコールスタックと所要時間を可視化したものです。 結論(たぶん) SSDの暗号化・復号をカーネルスレッドで行なっているのと、プロセススケジューラが awk とカーネルスレッドを同じ CPU にスケジューリングしていた(他に空いている CPU があるのに)。 awk file > file では暗号化データを復号するカーネルスレ…

大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由

…いるため、cat のプロセスと awk のプロセスが並列実行されていると想定できる。 実行時間(59.299s) なぜこうなるかというとパイプはバッファを持っているからだと思います。 $ strace -Ttt cat sample.txt |while read LINE > do > sleep 10 > echo $LINE > done 00:36:53.673164 execve("/bin/cat", ["cat", "sample.txt"], [/* 89 v…

perf + Flame Graphs で Linux カーネル内のボトルネックを特定する

…っているのはユーザープロセスのコールスタックなので、関係ないと思われます。/proc/sys/kernel/kptr_restrict が 0 以外だと /proc からカーネルのポインタが参照できなくなるようです。 Add the %pK printk format specifier and the /proc/sys/kernel/kptr_restrict sysctl.The %pK format specifier is designed to hide expo…

SQLチューニング原論(仮)

… アムダールの法則 プロセスの状態遷移 意識されていないページキャッシュとストレージキャッシュ 前提 SQL単体性能について書いている*3。 関連 Oracle Database のパフォーマンスに関する落書き - ablog SQLチューニングに関する資料 - ablog *1:オプティマイザ統計情報、表統計、索引統計、列統計、デフォルト統計、ディクショナリ統計、システム統計などがある *2:ここではコストベースオプティマイザとする *3:enqueue、latch、mut…

xargs -P vs split -n r/ の性能比較

gnu

…理をするケースだと子プロセス生成回数が少なく、ここまでの性能差は出ないと思う。 xargs -P $ seq 10e3 | strace -c xargs -I{} -P4 sh -c '/bin/true {}' % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 99.25 1.790977 63…

Oracle Database でランキュー待ちは DB Time > DB CPU + non-idle wait time として現われる

…が高くなってくると、プロセス(スレッド)がCPUを待つランキュー待ち時間が増えます。vmstatのr列などを見ればすぐにわかりますが、Oracle Database の性能分析で AWR レポートやStatspackレポートしか情報がないといった場合は以下のような兆候から読取ることができます。 DB Time が DB CPU + non-idle wait time より長くなる 待機イベントでの待機時間にランキュー待ち時間が含まれる*1 AWRレポートの Host CPU…

strace で出力される resumed の意味

…OCK_REALTIME, {1130322148, 939977000}) = 0 [pid 28772] ) = 1 (in [3]) strace(1) - Linux manual page プロセス1がシステムコールが実行されている時に、プロセス2がシステムコールを発行すると、時系列にトレースを出力するために、プロセス2のシステムコールをトレースに出力し、その後、終わっていなかったプロセス1のシステムコールを出力するときに resumed になるといった感じみたい。

Javaのスレッドダンプの読み方

… -3 だとJVMのプロセスの標準出力*5に出力されるが、jstack だと jstack の標準出力に出力されるため。 取得手順例 # jps でpidを調べて、jstack で取得する $ jps 21567 Jps 21083 Counter $ jstack 21083 # ps で PID を調べて、kill -3(-QUITでも同じ)で取得する $ ps auxw|grep [j]ava yazekats 21083 0.0 0.0 5411796 14924 p…

top でプロセスがスリープしている原因を表示する

…生のブログに さだださんと雑談していて、Solarisはページフォルトで寝ているとtopのステータスにそう表示されるから便利とかいう話に。それLinuxでも出来るよ。wchan表示したら、スリープしてる関数名表示されるから一発だよ。 やりかたtop を起動 f キーを押す(表示項目設定画面に遷移) y キーを押す(wchanを有効化) ESC キーを押す(topの表示画面に戻る) 革命の日々! プロセスが寝ている原因を知る方法 と書かれていたので、試してみた。 おぉ、すごい。

ps で表示されるCPU使用率 = CPU時間 / 実行時間

…でCPU使用率の高いプロセスを探す時、ps で表示されるCPU使用率は累計値になるので、top を使うけど、ps で表示されるCPU使用率の算出式が気になったので、調べてみた。 算出式 CPU使用率 = ( プロセスが使用したCPU時間 / プロセスの実行時間 ) * 100 man より $ ps -V procps version 3.2.8 $ man ps %cpu %CPU cpu utilization of the process in "##.#" forma…