クむック蚺断ず問題解決のための/ procを䜿甚したLinuxカヌネルの内郚キッチンの孊習

この蚘事は最新のLinuxに぀いおです。 たずえば、2.6.3xカヌネルを搭茉したRHEL6は機胜したすが、2.6.18カヌネルを搭茉したRHEL5ちなみに、本番環境で最も普及しおいる-ああ、いいえ。 そしおただ-栞デバッガヌやSytemTapスクリプトの説明はありたせん。 / procファむルシステムのいく぀かの有甚なノヌドに関しお、「cat / proc / PID / xyz」のような叀き良きシンプルなコマンドのみ。



「抑制」プロセスの蚺断



頻繁に発生する問題をラップトップで再珟した良い䟋を次に瀺したす。ナヌザヌは、 find



結果を返さずに「はるかに遅い」ず䞍平を蚀っおいfind



。 問題が䜕であるかを知っお、問題を解決したした。 しかし、私はそのような問題を解決する䜓系的なアプロヌチを蚭定するように頌たれたした。



幞いなこずに、システムはOEL6を実行しおいたす。 かなり新しいカヌネル぀たり-2.6.39 UEK2



それでは、蚺断を始めたしょう。



最初に、怜玢プロセスがただ動䜜しおいるかどうかを確認したす。



[root @ oel6〜]ps -ef | grep find

ルヌト27288 27245 4 11:57ポむント/ 0 00:00:01 怜玢 -タむプf

ルヌト27334 27315 0 11:57ポむント/ 1 00:00:00 grep怜玢



はい、ありたす-PID 27288さらに蚺断䟋ではこのpidを䜿甚したす



基本から始めお、このプロセスのボトルネックを芋おみたしょう。 䜕にもブロックされおいない堎合たずえば、必芁なものをすべおキャッシュから読み取る、CPUを100䜿甚する必芁がありたす。 IOたたはネットワヌクの問題が原因でブロックされおいる堎合、プロセッサの負荷は䜎くなるか、たったくなくなるはずです。



[root @ oel6〜]top -cbp 27288

top-11:58:15最倧7日間、338、2ナヌザヌ、負荷平均1.21、0.65、0.47

タスク合蚈1、実行0、スリヌプ1、停止0、ゟンビ0

CPU0.1us、0.1sy、0.0ni、99.8id、0.0wa、0.0hi、0.0si、0.0st

メモリ合蚈2026460k、1935780k䜿甚、90680k無料、64416kバッファ

スワップ合蚈4128764k、䜿甚枈み251004k、3877760k無料、662280kキャッシュ



PIDナヌザヌPR NI VIRT RES SHR SCPUMEM時間+コマンド

27288ルヌト20 0 109m 1160 844 D 0.0 0.1 001.11怜玢 -タむプf



「top」コマンドの出力は、このプロセスがCPUにたったく負荷をかけないこずを瀺しおいたすたたは負荷が非垞に小さいため、れロず芋なすこずができたす。 ただし、完党にフリヌズし、プロセッサクォンタムを取埗する機䌚がたったくないプロセスず、スタンバむ状態から垞に起動しおすぐに再びスリヌプ状態になるプロセスたずえば、垞にタむムアりトで終了するポヌリング操䜜、そしお、プロセスは再びそれを呌び出しおスリヌプ状態になりたす。 残念ながら、これらの2぀の状態を認識するには「トップ」コマンドでは䞍十分です。 しかし、少なくずもこのプロセスはプロセッサ時間を浪費しないこずがすでにわかっおいたす。



他のツヌルを詊しおみたしょう。 通垞、プロセスがこのようにハングするように芋える堎合CPUの0は、通垞、プロセスが䜕らかのシステムコヌルをブロックしおいるこずを意味したす-これにより、カヌネルがプロセスをスリヌプさせたす、そのプロセスでstrace



を実行しお、どのシステムコヌルを远跡したす圌は珟圚立ち埀生しおいたす。 プロセスが実際に完党にハングせず、定期的にシステムコヌルから戻っお起動する堎合、これはstraceの出力にも衚瀺されたすシステムコヌルは定期的に終了し、再床呌び出されたす。



[root @ oel6〜]strace -cp 27288

プロセス27288が添付されたした-䞭断しお䞭断したす



^ C

^ Z

[1] + strace -cp 27288を停止したした



[root @ oel6〜]kill -9 %%

[1] + strace -cp 27288を停止したした

[root @ oel6〜]

[1] +殺された痕跡-cp 27288



おっず... straceチヌム自䜓もハングしおいるようです 圌女は長い間䜕も衚瀺せず、CTRL + Cを抌しおも応答しなかったため、最初にCTRL + Zを抌しお圌女をバックグラりンドに送り、その埌完党に殺す必芁がありたした。 簡単な蚺断ではありたせん



pstackを詊しおみたしょうLinuxでは、pstackはGDBデバッガヌの単なるラッパヌスクリプトです。 Pstackはカヌネルの内郚キッチンに぀いおは䜕も教えたせんが、少なくずもそれがどのようなシステムコヌルであるかを瀺したす通垞はナヌザヌスタック䞊のlibcラむブラリ関数呌び出しのように芋えたす。



[root @ oel6〜]pstack 27288



^ C

^ Z

[1] + pstack 27288を停止したした



[root @ oel6〜]%%を殺す

[1] + pstack 27288を停止したした

[root @ oel6〜]

[1] +終了したpstack 27288



Pstackも説明なしでハングしたした



そのため、プロセスが100無料alasなのか、99.99目芚めおすぐに眠りに぀くなのかはただわかりたせん。たた、これがどこで起こったのかもわかりたせん。



他にどこが芋えたすか よくアクセスできる別の堎所がありたす。ステヌタスずWCHANフィヌルドは、叀き良きpsコマンドを䜿甚しお内容を調べるこずができたすたぶん、すぐに実行しおゟンビに察凊しおいないこずを確認しおください。



[root @ oel6〜]ps -flp 27288

FS UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD

0 Dルヌト27288 27245 0 80 0-28070 rpc_wa 11:57ポむント/ 0 00:00:01怜玢 -タむプf



プロセスが匕き続き同じ状態にあるこずを確認するには、psを連続しお数回実行する必芁がありたす間違ったずきに行われた唯䞀の詊行に基づいお誀った結論に達したくないですか。 ただし、ここでは勇気を持っお1回だけの起動を瀺しおいたす。



プロセスは状態D「サりンドスリヌプ」にあり、通垞はディスクI / Oに関連付けられおいたすpsのマニュアルペヌゞにも蚘茉されおいたす。 さらに、WCHANフィヌルドプロセスを䌑止状態たたは埅機状態にした関数の名前は少しトリミングされおいたす。 ps呌び出しにオプションを远加しおこのフィヌルドの出力を少し広くするこずができたすが、その内容はいずれの堎合も/ procシステムから取埗されるため、゜ヌスを盎接芋おみたしょう繰り返したすが、凍結を確認するためにこれを数回行うずよいでしょうプロセスが完了しおいるかどうか、たたは非垞に頻繁にたくさん寝おいるかどうか



[root @ oel6〜]cat / proc / 27288 / wchan

rpc_wait_bit_killable





うヌん...プロセスは䜕らかのRPCコヌルを期埅しおいるようです。 これは通垞、プロセスが他のプロセスず通信しおいるこずを意味したすロヌカルマシン䞊、たたはリモヌトサヌバヌ䞊でも。 しかし、ただ理由はわかりたせん。



䜕か動きがありたすか、たたはプロセスが完党に行き詰っおいたすか



蚘事の「肉」に進む前に、プロセスが完党にスタックしおいるかどうかを刀断したしょう。 最新のカヌネルでは、/ proc / PID / statusを調べるこずでこれに぀いお知るこずができたす。 わかりやすくするために、興味深い倀を匷調しおいたす。



[root @ oel6〜]cat / proc / 27288 / status

名前怜玢

状態Dディスクスリヌプ

Tgid27288

Pid27288

PPid27245

TracerPid0

Uid0 0 0 0

Gid0 0 0 0

Fdsize256

グルヌプ0 1 2 3 4 6 10

VmPeak112628 kB

VmSize112280 kB

VmLck0 kB

VmHWM1508 kB

VmRSS1160 kB

VmData260 kB

VmStk136 kB

VmExe224 kB

VmLib2468 kB

VmPTE88 kB

VmSwap0 kB

スレッド1

SigQ4/15831

SigPnd0000000000040000

ShdPnd0000000000000000

SigBlk0000000000000000

SigIgn0000000000000000

SigCgt0000000180000000

CapInh0000000000000000

CapPrmffffffffffffffff

CapEffffffffffffffffff

Capbndffffffffffffffff

Cpus_allowedffffffff、ffffffff

Cpus_allowed_list0-63

Mems_allowed00000000,00000000,00000000,00,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000、 00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000001

Mems_allowed_list0

voluntary_ctxt_switches9950

nonvoluntary_ctxt_switches17104





プロセスは状態D-ディスクスリヌプ「サりンド」スリヌプです。 たた、 voluntary_ctxt_switches



ずnonvoluntary_ctxt_switches



倀にも泚意しおください-プロセッサヌがCPUのnonvoluntary_ctxt_switches



受け取ったたたは返した回数がわかりたす。 次に、数秒埌にコマンドを再床実行し、倀が増加したかどうかを確認したす。 私の堎合、数は増えたせんでした。したがっお、プロセスがき぀くハングするこずをお勧めしたすたあ、少なくずもチヌム間で数秒間起きないでください。 そのため、プロセスが完党にフリヌズしおいるこずを確信できるようになりたしたレヌダヌの䞋を飛んでいるだけでなく、プロセッサの時間の0.04を垞に消費しおいたす。



ちなみに、コンテキストスむッチの数を確認できる堎所がさらに2぀ありたすさらに、2぀目は叀代のカヌネルで䜿甚可胜です。



[root @ oel6〜]cat / proc / 27288 / sched

怜玢27288、threads1

-se.exec_start617547410.689282

se.vruntime2471987.542895

se.sum_exec_runtime1119.480311

se.statistics.wait_start0.000000

se.statistics.sleep_start0.000000

se.statistics.block_start617547410.689282

se.statistics.sleep_max0.089192

se.statistics.block_max60082.951331

se.statistics.exec_max1.110465

se.statistics.slice_max0.334211

se.statistics.wait_max0.812834

se.statistics.wait_sum724.745506

se.statistics.wait_count27211

se.statistics.iowait_sum0.000000

se.statistics.iowait_count0

se.nr_migrations312

se.statistics.nr_migrations_cold0

se.statistics.nr_failed_migrations_affine0

se.statistics.nr_failed_migrations_running96

se.statistics.nr_failed_migrations_hot1794

se.statistics.nr_forced_migrations150

se.statistics.nr_wakeups18507

se.statistics.nr_wakeups_sync1

se.statistics.nr_wakeups_migrate155

se.statistics.nr_wakeups_local18504

se.statistics.nr_wakeups_remote3

se.statistics.nr_wakeups_affine155

se.statistics.nr_wakeups_affine_attempts158

se.statistics.nr_wakeups_passive0

se.statistics.nr_wakeups_idle0

avg_atom0.041379

avg_per_cpu3.588077

nr_switches27054

nr_voluntary_switches9950

nr_involuntary_switches17104

se.load.weight1024

ポリシヌ0

プリオ120

クロックデルタ72



ここでは、 nr_switches



 nr_voluntary_switches



+ nr_involuntary_switches



等しいの数を調べる必芁がありたす。



䞊蚘の郚分のnr_switchesの総数は27054であり、出力/ proc / PID / schedstatの3番目のフィヌルドにもありたす。



[root @ oel6〜]cat / proc / 27288 / schedstat

1119480311 724745506 27054





そしお、それは増加したせん...



/ procファむルシステムを䜿甚したコアカヌネルキッチンの探玢



私たちのプロセスは非垞に固く凍結されおいるようです:)。 Straceずpstackは圹に立ちたせん。 圌らはptraceシステムコヌルを䜿甚しおプロセスに接続し、メモリに挿入したすが、プロセスが絶望的に​​ハングするため、おそらく䜕らかのシステムコヌルでハングするので、ptraceコヌルもそれ自䜓でハングするず仮定したすずころで、私はどういうわけか、タヌゲットプロセスに接続する瞬間にstrace自䜓でstraceを実行しようずしたしたが、これによりプロセスがクラッシュしたした。



どのシステムコヌルでstraceたたはpstackなしで電話を切ったのかを知るにはどうすればよいですか 幞いなこずに、私たちは最新のコアに取り組んでいたす ようこそ/ proc / PID / syscall



[root @ oel6〜]cat / proc / 27288 / syscall

262 0xffffffffffffffff9c 0x20cf6c8 0x7fff97c52710 0x100 0x100 0x676e776f645f616d 0x7fff97c52658 0x390e2da8ea



぀たずく そしお、私はこれで䜕をすべきですか

たあ、通垞、これらの数字は䜕かのために必芁です。 “ 0xAVeryBigNumber”のようなものが衚瀺される堎合、これは通垞メモリ内のアドレスでありpmapなどのナヌティリティで䜿甚できたす、数倀が小さい堎合は、おそらくある皮の配列のむンデックスです。 たずえば、開いおいるファむル蚘述子の配列/ proc / PID / fdで確認できたす、たたはこの堎合、システムコヌルを凊理しおいるため、これはプロセスが存圚するシステムコヌルの数です そのため、プロセスがシステムコヌル262でスタックしおいるこずがわかりたした。



システムコヌル番号は、オペレヌティングシステム、OSバヌゞョン、プラットフォヌムによっお異なる堎合があるため、OSから正しいヘッダヌファむルが必芁になるこずに泚意しおください。 / usr / includeフォルダヌで「syscall *」を探すこずから始めるのがよいでしょう。 私のバヌゞョンおよびLinuxプラットフォヌム64ビットでは、システムコヌルはファむル/usr/include/asm/unistd_64.h



定矩されおいたす。



[root @ oel6〜]grep 262 /usr/include/asm/unistd_64.h

#define __NR_ newfstatat 262





もうすぐです 262システムコヌルはnewfstatat



ず呌ばれるものnewfstatat



。 人を動かし、それが䜕であるかを知るこずは残っおいたす。 システムコヌルの名前に぀いお簡単なヒントを瀺したす。マニュアルペヌゞで必芁な名前が芋぀からない堎合は、あらゆる皮類のサフィックスずプレフィックスなしで怜玢しおみおくださいたずえば、「man pread64」ではなく「man pread」-この堎合、「new」prefix- man fstatat



なしでmanを実行したすman fstatat



。 たあ、たたは単にそれをグヌグル。



堎合によっおは、この「new-fstat-at」システムコヌルにより、通垞のstatシステムコヌルず非垞によく䌌たファむルプロパティを読み取るこずができたす。 そしお、私たちはファむルのメタデヌタを読み取る操䜜に専念したした。 それで、私たちはさらに䞀歩前進したした。 ただし、凍結が発生した理由はただわかりたせん。



さお、 私の小さな友人 / proc / PID / stackに挚拶する時が来たした。これにより、procファむルの内容を印刷するだけで、プロセスの栞スタックのチェヌンを芋るこずができたす!!!



[root @ oel6〜]cat / proc / 27288 / スタック

[] rpc_wait_bit_killable + 0x24 / 0x40 [sunrpc]

[] __rpc_execute + 0xf5 / 0x1d0 [sunrpc]

[] rpc_execute + 0x43 / 0x50 [sunrpc]

[] rpc_run_task + 0x75 / 0x90 [sunrpc]

[] rpc_call_sync + 0x42 / 0x70 [sunrpc]

[] nfs3_rpc_wrapper.clone.0 + 0x35 / 0x80 [nfs]

[] nfs3_proc_getattr + 0x47 / 0x90 [nfs]

[] __nfs_revalidate_inode + 0xcc / 0x1f0 [nfs]

[] nfs_revalidate_inode + 0x36 / 0x60 [nfs]

[] nfs _getattr + 0x5f / 0x110 [nfs]

[] vfs_getattr + 0x4e / 0x80

[] vfs_fstatat + 0x70 / 0x90

[] sys_ newfstatat + 0x24 / 0x50

[] system_call_fastpath + 0x16 / 0x1b

[] 0xffffffffffffffff



䞀番䞊の機胜は、カヌネルコヌド内の堎所です。 これはたさにWCHANフィヌルドが既に蚀ったこずですただし、実際には、必芁に応じおプロセスをスリヌプたたはりェむクアップするカヌネルschedule()



関数など、いく぀かの機胜があるこずに泚意しおください。ただし、これらの機胜はここには瀺したせんおそらく、それらはすでに期埅の状態の結果であり、その原因ではないからです。



このタスクのための完党なカヌネルスタックを手元に甚意しお、ボトムアップで調査し、 rpc_wait_bit_killable



関数rpc_wait_bit_killable



がスケゞュヌラヌの呌び出しにどのようにrpc_wait_bit_killable



、 rpc_wait_bit_killable



状態になったかを把握するこずがrpc_wait_bit_killable



たす。



system_call_fastpath



コヌルは、凊理しおいるnewfstatat sys_newfstatat



システムコヌルを実装するコヌドに぀ながった暙準カヌネルシステムコヌルハンドラです。 さらに「子」関数に移動するず、NFSに関連するいく぀かのこずがわかりたす。 これはすでに、NFS凊理コヌド領域のどこかにいるずいう100反論できない蚌拠です 䞊蚘で芋た限り、これらのNFS関数の最埌は、RPC関数rpc_call_syncを呌び出しお別のプロセスにアクセスしたす。 この堎合、おそらく[kworker/N:N]



、 [nfsiod]



、 [lockd]



たたは[rpciod]



IOカヌネルスレッドです。 そしお、これらのスレッドのいく぀かは䜕らかの理由で応答したせん通垞、ネットワヌク接続の切断、パケット損倱、たたは䜕らかのネットワヌクの問題を疑う必芁がありたす。



これらの補助スレッドのいずれかがネットワヌク関連のコヌドでハングしおいるかどうかを刀断するには、たずえば、kworkersがRPCをNFSに接続するだけでなく、はるかに倚くの機胜を実行する堎合でも、スタックを考慮する必芁がありたす 別の実隓NFSを介しお倧きなファむルをコピヌするだけで、コヌドでネットワヌクず通信するために埅機しおいるkworkersの1人を芋぀けたした。



[root @ oel6 proc] `pgrep worker`のiの堎合; ps -fp $ i; cat / proc / $ i /スタック; やった

UID PID PPID C STIME TTY TIME CMD

ルヌト53 2 0 2月14日 00:04:34 [ kworker / 11]



[] __cond_resched + 0x2a / 0x40

[] lock_sock_nested + 0x35 / 0x70

[] tcp_sendmsg + 0x29 / 0xbe0

[] inet_sendmsg + 0x48 / 0xb0

[] sock_sendmsg + 0xef / 0x120

[] kernel_sendmsg + 0x41 / 0x60

[] xs_send_kvec + 0x8e / 0xa0 [sunrpc]

[] xs_sendpages + 0x173 / 0x220 [sunrpc]

[] xs_tcp_send_request + 0x5d / 0x160 [sunrpc]

[] xprt_transmit + 0x83 / 0x2e0 [sunrpc]

[] call_transmit + 0xa8 / 0x130 [sunrpc]

[] __rpc_execute + 0x66 / 0x1d0 [sunrpc]

[] rpc_async_schedule + 0x15 / 0x20 [sunrpc]

[] process_one_work + 0x13e / 0x460

[] worker_thread + 0x17c / 0x3b0

[] kthread + 0x96 / 0xa0

[] kernel_thread_helper + 0x4 / 0x10



おそらく、カヌネルトレヌスを有効にしお、どのカヌネルスレッドが盞互に通信しおいるかを正確に芋぀けるこずは難しくありたせんが、この蚘事ではこれを行いたくありたせん。 実甚的なそしお簡単な蚺断挔習にしおください



理解しお「修​​理」する



いずれの堎合でも、最新のLinuxでカヌネルスタックの印刷を非垞に簡単に取埗できるためどのバヌゞョンのカヌネルが登堎したか正確には蚀えたせん、findコマンドがハングした堎所、぀たりカヌネルのNFSコヌドで䞀貫しお結論を​​出すこずができたしたLinux たた、NFSに関連するハングアップを凊理しおいる堎合は、おそらくネットワヌクの問題を疑う必芁がありたす。 瀺された問題の再珟方法に興味がある堎合は、すべおが非垞に簡単です。仮想マシンからNFSボリュヌムをマりントし、findコマンドを実行しおから、マシンを停止したした。 これにより、TCP゚ンドノヌドに通知せずに接続がサむレントに終了する、たたは䜕らかの理由でパケットが単に通過しないネットワヌク構成、ファむアりォヌルの問題がある堎合ず同じ症状が生じたした。



スタックの䞀番䞊には「killable」関数の1぀安党に䞭断できるrpc_wait_bit_killable



があるため、 kill -9



コマンドでそれをrpc_wait_bit_killable



できたす。



[root @ oel6〜]ps -fp 27288

UID PID PPID C STIME TTY TIME CMD

ルヌト27288 27245 0 11:57ポむント/ 0 00:00:01 怜玢 -タむプf

[root @ oel6〜]kill -9 27288



[root @ oel6〜]ls -l / proc / 27288 / stack

ls/ proc / 27288 / stackにアクセスできたせんそのようなファむルたたはディレクトリはありたせん



[root @ oel6〜]ps -fp 27288

UID PID PPID C STIME TTY TIME CMD

[root @ oel6〜]



プロセスは完了です。



「ひざの䞊の」カヌネルスレッドのプロファむリング



ファむル/ proc / PID / stackは通垞のテキストファむルのように芋えるこずに泚意しおください。 したがっお、カヌネルスレッドプロファむルを簡単に取埗できたす 以䞋は、「ひざたずいお」珟圚のシステムコヌルずカヌネルスタックの昇栌システムコヌルの堎合を確認し、これらすべおを半階局プロファむルに結合する方法です。



[root @ oel6〜]export LC_ALL = C ; for iの{1..100}; do cat / proc / 29797 / syscall | awk '{print $ 1}'; cat / proc / 29797 /スタック| / home / oracle / os_explain -k; usleep 100000; 完了| sort -r | uniq -c



  69ランニング
       1 ffffff81534c83
       2 ffffff81534820
       6,247
      25,180 


     100 0xffffffffffffffff 
       1 thread_group_cputime 
      27 sysenter_dispatch 
       3 ia32_sysret 
       1 task_sched_runtime 
      27 sys32_pread 
       1 compat_sys_io_submit 
       2 compat_sys_io_getevents 
      27 sys_pread64 
       2 sys_io_getevents 
       1 do_io_submit 
      27 vfs_read 
       2 read_events 
       1 io_submit_one 
      27 do_sync_read 
       1 aio_run_iocb 
      27 generic_file_aio_read 
       1 aio_rw_vect_retry 
      27 generic_file_read_iter 
       1 generic_file_aio_read 
      27 mapping_direct_IO 
       1 generic_file_read_iter 
      27 blkdev_direct_IO 
      27 __blockdev_direct_IO 
      27 do_blockdev_direct_IO 
      27 dio_post_submission 
      27 dio_await_completion 
       6 blk_flush_plug_list




これにより、プロセスがカヌネル内のどこで時間を費やしおいるのかを非垞に倧たかに評䟡できたす。 システムコヌル番号は、䞊郚で個別に匷調衚瀺されたす。 「実行䞭」ずは、蚺断䞭にプロセスがナヌザヌ空間で機胜したこずを意味したすシステムコヌルでは機胜したせん。 そのため、プロセスがナヌザヌコヌドであった時間の69です。 システムコヌル180私のシステムではnfsservctlで25、システムコヌル247waitidで6。



䞊蚘では、䜜成者はスクリプト/ home / oracle / os_explainの呌び出しを䜿甚しおいたす。 参照で取埗できたす-玄。 perev。



出力には、さらに2぀の「関数」が衚瀺されたすが、䜕らかの理由で名前で衚瀺されたせんでした。 ただし、それらのアドレスは既知であるため、手動で確認できたす。



[root @ oel6〜]cat / proc / kallsyms | grep -i ffffff81534c83

ffffffff81534c83 t ia32_sysret



これは32ビットサブシステムのシステムコヌルからの戻り倀のようですが、この関数自䜓はシステムコヌルではないため単なる内郚補助関数です、明らかに/ proc /スタックハンドラはその名前を衚瀺したせんでした。 / procの状態はリヌダヌず䞀臎しないため、これらのアドレスが衚瀺される可胜性もありたす。䞀方、1぀のスレッドがこれらのメモリ構造ずスレッドを読み取る芁玠を倉曎するず、叀いデヌタが衚瀺される堎合がありたす。



2番目のアドレスを同時に確認したす。



[root @ oel6〜]cat / proc / kallsyms | grep -i ffffff81534820

[root @ oel6〜]



䜕も芋぀かりたせんでしたか ただし、デバッグはここたでではありたせん このアドレスの呚蟺で䜕か面癜いものを探したしょう。 たずえば、アドレスの末尟にある最埌の数桁を削陀したす。



[root @ oel6〜]cat / proc / kallsyms | grep -i ffffff815348

ffffffff8153480d t sysenter_do_call

ffffffff81534819 t sysenter_dispatch

ffffffff81534847 t sysexit_from_sys_call

ffffffff8153487a t sysenter_auditsys

ffffffff815348b9 t sysexit_audit



sysenter_dispatch関数は、/ proc / PID / stackにマッピングされた元のアドレスの1バむト前に文字通り開始するようです。 そのため、ほずんどの堎合1バむトをほが完了したしたおそらく、動的デバッグ甚にそこにあるNOPコマンド。 ただし、スタックのこれらの郚分はsysenter_dispatch



関数にあるようですsysenter_dispatch



関数は、それ自䜓はシステムコヌルではなく、ヘルパヌ関数です。  少し掘り䞋げた堎合-違いはただ1バむトではなく7バむトです。数字は16進数です-およそTransl。 



スタックプロファむリングの詳现



LinuxのPerf、SolarisのDTraceのOprofileおよびprofile



ナヌティリティなど、さたざたなスタックプロモヌションナヌティリティは、呜什ポむンタヌレゞスタ32ビットIntelのEIP、たたはx64のRIPず、スタックポむンタヌ32ビットのESPおよびRSPのESP x64プロセッサ䞊の珟圚のスレッドに察しお、スタックポむンタに沿っお戻りたす。 したがっお、これらのナヌティリティは、テスト時にCPUで実行されるスレッドのみを衚瀺できたすこれは、もちろん、プロセッサの負荷が高い問題を探しおいるずきは玠晎らしいこずですが、デッドロックたたは長時間埅機/䌑止状態のプロセスの蚺断にはたったく圹に立ちたせん。



Linux、Solaris、HP-UX、procstackAIX䞊、ORADEBUG SHORT_STACK䞊のpstack、および/ proc / PID / stack疑䌌ファむルの読み取りなどのナヌティリティは、CPUプロファむリングナヌティリティぞの適切な远加眮換ではありたせん-プロセスメモリに独立しおアクセスできる限りスケゞュヌラヌの状態からスタックを読み取りたす。プロセスがスリヌプしおCPUに觊れない堎合、プロセススタックの最䞊郚は保存されたコンテキストから読み取るこずができたす。保存されたコンテキストは、コンテキストの切り替え䞭にOSスケゞュヌラヌによっおカヌネルメモリに保存されたす。



もちろん、プロセッサむベントプロファむリングナヌティリティは、倚くの堎合、pstack、OProfile、Perf、さらにはDTraceSolaris11のCPCプロバむダヌ以䞊のものを実行できたす。たずえば、内郚プロセッサカりンタを蚭定および読み取り、メモリアクセスの埅機䞭にミスしたCPUサむクル数などを評䟡したす。L1 / L2キャッシュのミス数など しかし、Kevin Clossonがこれに぀いお曞いおいるこずをよく読んでくださいPerf、Oprofile



幞運を祈りたす:-)



関連トピック






All Articles