{"id":4228,"date":"2022-06-13T16:24:14","date_gmt":"2022-06-13T16:24:14","guid":{"rendered":"https:\/\/nenadnoveljic.com\/blog\/?p=4228"},"modified":"2022-06-13T16:24:17","modified_gmt":"2022-06-13T16:24:17","slug":"oradebug-request-completion","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/","title":{"rendered":"oradebug request completion"},"content":{"rendered":"<h1>Measuring time<\/h1>\n<p>In <a href=\"https:\/\/nenadnoveljic.com\/blog\/perilous-new-undocumented-tracing-feature-in-oracle-21c\/\">the previous blog post<\/a>, I described a hanging issue caused by a debugging event in a Oracle 21c database. In a nutshell, the database writers started compulsively signaling each other to generate some debugging information. In the end, this non-DBWR work distracted the database writers so much that they completely neglected their core business &#8211; writing dirty blocks to files. The database writers were spending an extreme amount of time in the part of the code instrumented by the &#8220;oradebug request completion&#8221; wait event. In this article, I&#8217;ll describe the internals of this undocumented wait event. I conducted the research on a 21.5 database.<\/p>\n<p>The first question is, how long does the execution of a single debugging event last? We can find that out by measuring the time between the Oracle C function calls kskthbwt and kskthewt. These functions mark the beginning and the end of a wait event, respectively. The second argument to kskthbwt is the event code, which can be queried from the data dictionary:<\/p>\n<pre><code>select event#,name from v$event_name where name like 'oradebug request completion' ;\n\n    EVENT# NAME\n---------- ----------------------------------------------------------------\n       <span style=\"color:blue\">588<\/span> oradebug request completion<\/code><\/pre>\n<p>Now we can use this event code to filter only the event of interest:<\/p>\n<pre><code>sudo bpftrace -e 'uprobe:\/u00\/oracle\/orabase\/product\/21.5.0.0.220131_a\/bin\/oracle:kskthbwt+2\n\/ pid == 1857586 &amp;&amp; arg1 == <span style=\"color:blue\">588<\/span> \/\n{\n  @start[tid] = nsecs ;\n}\n\nuprobe:\/u00\/oracle\/orabase\/product\/21.5.0.0.220131_a\/bin\/oracle:kskthewt+2\n\/ @start[tid] \/\n{\n  $duration_us = ( nsecs - @start[tid] ) \/ 1000 ;\n  time(\"%H:%D:%S \");\n  printf(\"duration [us] %d\\n\", $duration_us);\n  delete(@start[tid])\n}'<\/code><\/pre>\n<pre><code>17:06\/10\/22:22 duration [us] <span style=\"color:red\">5002550<\/span>\n17:06\/10\/22:22 duration [us] 14\n17:06\/10\/22:22 duration [us] 5405\n17:06\/10\/22:22 duration [us] 4519\n17:06\/10\/22:22 duration [us] 4501\n17:06\/10\/22:22 duration [us] 4518\n17:06\/10\/22:22 duration [us] 5568\n17:06\/10\/22:22 duration [us] 5461\n17:06\/10\/22:22 duration [us] 6338\n17:06\/10\/22:22 duration [us] 5003\n17:06\/10\/22:22 duration [us] 4470\n17:06\/10\/22:22 duration [us] 8890\n17:06\/10\/22:22 duration [us] 5462\n17:06\/10\/22:22 duration [us] 5471\n17:06\/10\/22:22 duration [us] 5761\n17:06\/10\/22:22 duration [us] 5490\n17:06\/10\/22:22 duration [us] 4408\n17:06\/10\/22:22 duration [us] 4397\n17:06\/10\/22:22 duration [us] 5459\n17:06\/10\/22:22 duration [us] 7917\n17:06\/10\/22:22 duration [us] 5412\n17:06\/10\/22:22 duration [us] 4372\n17:06\/10\/22:22 duration [us] 5435\n17:06\/10\/22:22 duration [us] 4362\n...<\/code><\/pre>\n<p>We can see an outburst of 24 &#8220;oradebug request completion&#8221; events. The first occurrence was extreme &#8211; it lasted 5s, which is an eternity for a database writer. This is a serious issue.<\/p>\n<h1>Off-CPU analysis<\/h1>\n<p>The observed database writer process hasn&#8217;t spent almost any time on CPU &#8211; the cumulative CPU time for the process hasn&#8217;t changed:<\/p>\n<pre><code>ps -p 1857586\n    PID TTY          TIME CMD\n1857586 ?        00:01:31 ora_dbw0_dbc<\/code><\/pre>\n<p>Generally, high frequency stack sampling in regular intervals is a useful method to get an insight into a proprietary software. However, for a non-CPU-bound processes like this one, high frequency stack sampling might skew the picture because it would favor the code spending most time on CPU, but as the process isn&#8217;t CPU-bound, that might not be representative of where the time is being spent. Therefore, we must study off-CPU behavior as Gregg Brendan described it <a href=\"https:\/\/www.brendangregg.com\/offcpuanalysis.html\">here<\/a>. His bcc program <a href=\"https:\/\/github.com\/iovisor\/bcc\/blob\/master\/tools\/offcputime.py\">offcputime<\/a> takes a stack at each context switch and then aggregates the time this call stack spent blocking.<\/p>\n<pre><code>sudo \/usr\/share\/bcc\/tools\/offcputime -p 1857586<\/code><\/pre>\n<p>The following stack caused most off-CPU time:<\/p>\n<pre><code>finish_task_switch\nschedule\nschedule_timeout\ndo_semtimedop\nksys_semtimedop\n__x64_sys_semtimedop\ndo_syscall_64\nentry_SYSCALL_64_after_hwframe\n<span style=\"color:blue\">semtimedop<\/span>\nskgpwwait\n<span style=\"color:blue\">ksliwat<\/span>\nkslwaitctx\nksarcv\nksbabs\nksbrdp_int\nksbdispatch\nopirip\nopidrv\nsou2o\nopimai_real\nssthrdmain\nmain\n__libc_start_main\n[unknown]\n-                ora_dbw0_dbc (1857586)\n\t39157040<\/code><\/pre>\n<p>However, in the stack above the database writer was only idly waiting and periodically waking up to check whether there&#8217;s something to do. We know this because of the functions <span style=\"color:blue\">semtimedop<\/span> and <span style=\"color:blue\">ksliwat<\/span> are on the stack, see Frits Hoogland&#8217;s presentation <a href=\"https:\/\/fritshoogland.files.wordpress.com\/2015\/09\/profiling-the-logwriter-and-database-writer.pdf\">Profiling the logwriter and<br \/>\ndatabase writer<\/a> for more explanation. These stacks were collected before and after the actual problem happened.<\/p>\n<p>The following stack looks unusual and was causing high blocking time:<\/p>\n<pre><code>finish_task_switch\nschedule\nschedule_hrtimeout_range_clock\n<span style=\"color:red\">schedule_hrtimeout_range<\/span>\npoll_schedule_timeout.constprop.16\n<span style=\"color:red\">do_select<\/span>\ncore_sys_select\nkern_select\n__x64_sys_select\ndo_syscall_64\nentry_SYSCALL_64_after_hwframe\n__libc_select\nksdx_cmdreq_wait\nksdx_cmdreq_wait_for_pending\nksdxdocmdmultex\nksdxdocmdmult\nksudmp_proc_short_stack\nkcbbckptmon\nksb_act_run_int\nksb_act_run\nksbcti\nksbabs\nksbrdp_int\nksbdispatch\nopirip\nopidrv\nsou2o\nopimai_real\nssthrdmain\nmain\n__libc_start_main\n[unknown]\n-                ora_dbw0_dbc (1857586)\n\t4885099<\/code><\/pre>\n<p>The program entered the syscall select and then was sleeping for a while (the function <a href=\"https:\/\/manpages.debian.org\/testing\/linux-manual-4.8\/schedule_hrtimeout_range.9.en.html \">schedule_hrtimeout_range<\/a> is on the stack.)<\/p>\n<h1>select syscall<\/h1>\n<p>The syscall <a href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/select.2.html\">select<\/a> checks multiple file descriptors if there is something to read or write. Without this system call, the application would need to monitor every file descriptor in a separate thread.<\/p>\n<p>The arguments are as follows:<\/p>\n<pre><code>int select(int nfds, fd_set *restrict readfds,\n\t\t  fd_set *restrict writefds, fd_set *restrict exceptfds,\n\t\t  struct timeval *restrict timeout);<\/code><\/pre>\n<p>The system call receives three sets of file descriptors in the fd_set structures. nfds, the first argument, is highest-numbered file descriptor in any of the three sets, plus 1. Finally, the timeout parameter defines for how long to block the thread before waking up to check the file descriptors for input and output. From the Linux kernel function schedule_hrtimeout_range, we can infer that a non-zero timeout was passed to the syscall, and that the program spent a substantial amount of time doing nothing.<\/p>\n<p>The following bpftrace script quantifies, how much time of the total wait event time was spent sleeping in the select syscall:<\/p>\n<pre><code>sudo bpftrace -e 'uprobe:\/u00\/oracle\/orabase\/product\/21.5.0.0.220131_a\/bin\/oracle:kskthbwt+2\n\/ pid == 1857586 &amp;&amp; arg1 == 588 \/\n{\n  @start[tid] = nsecs ;\n}\n\ntracepoint:syscalls:sys_enter_select\n\/ @start[tid] \/\n{\n  @start_select[tid] = nsecs ;\n}\n\ntracepoint:syscalls:sys_exit_select\n\/ @start_select[tid] \/\n{\n  @duration_select_ms = sum( ( nsecs - @start_select[tid] ) \/ 1000 \/ 1000 );\n  @count_select = count();\n  delete(@start_select[tid]);\n}\n\nuprobe:\/u00\/oracle\/orabase\/product\/21.5.0.0.220131_a\/bin\/oracle:kskthewt+2\n\/ @start[tid] \/\n{\n  $duration_ms = ( nsecs - @start[tid] ) \/ 1000 \/ 1000 ;\n  printf(\"Duration wait event [ms] %d\\n\", $duration_ms);\n  delete(@start[tid]);\n  delete(@start_select[tid]);\n  exit()\n}'<\/code><\/pre>\n<pre><code>Duration wait event [ms] 5000\n\n@count_select: 4612\n\n@duration_select_ms: 4599<\/code><\/pre>\n<p>Out of 5000 ms spent in a oradebug wait event, 4599 ms were spent waiting in a select syscall.<\/p>\n<h1>Tracing select<\/h1>\n<p>Next, I inspected the individual select syscalls with bpftrace. bpftrace can access the following arguments of the select syscall:<\/p>\n<pre><code>sudo bpftrace -lv 'tracepoint:syscalls:sys_enter_select'\ntracepoint:syscalls:sys_enter_select\n    int __syscall_nr\n    int n\n    fd_set * inp\n    fd_set * outp\n    fd_set * exp\n    struct timeval * tvp<\/code><\/pre>\n<p>In particular, I wanted to find the duration of each timeout, and how many file descriptors were being handled:<\/p>\n<pre><code>sudo bpftrace -e 'tracepoint:syscalls:sys_enter_select\n\/ pid == 1857586 \/\n{\n  printf(\"Number of file descriptors: %d Sleep: %d sec %d usec\\n\", args-&gt;n, args-&gt;tvp-&gt;tv_sec, args-&gt;tvp-&gt;tv_usec);\n}'<\/code><\/pre>\n<pre><code>Number of file descriptors: <span style=\"color:red\">0<\/span> Sleep: 0 sec <span style=\"color:red\">1000 usec<\/span>\nNumber of file descriptors: 0 Sleep: 0 sec 1000 usec\nNumber of file descriptors: 0 Sleep: 0 sec 1000 usec\nNumber of file descriptors: 0 Sleep: 0 sec 1000 usec\nNumber of file descriptors: 0 Sleep: 0 sec 1000 usec\n...<\/code><\/pre>\n<p>Surprisingly, there weren&#8217;t any file descriptors passed. This means that the select system call was used only to implement a sleep. The sleeping interval was <span style=\"color:red\">1 ms<\/span>.<\/p>\n<h1>Profiling syscalls<\/h1>\n<p>strace flag -c can be used for profiling system calls:<\/p>\n<pre><code>sudo strace -f -c -p 1857676<\/code><\/pre>\n<pre><code>% time     seconds  usecs\/call     calls    errors syscall\n------ ----------- ----------- --------- --------- ----------------\n 33.06    0.116057          28      <span style=\"color:red\">4049<\/span>           <span style=\"color:red\">openat<\/span>\n 23.29    0.081759          20      <span style=\"color:red\">4047<\/span>           <span style=\"color:red\">read<\/span>\n 21.53    0.075589          19      <span style=\"color:red\">3849<\/span>         6 <span style=\"color:red\">select<\/span>\n 18.51    0.064976          16      <span style=\"color:red\">4049           close<\/span>\n  1.92    0.006740          33       201           write\n  0.36    0.001268          24        51           lseek\n  0.36    0.001262          18        69           rt_sigprocmask\n  0.28    0.000995          41        24        24 semtimedop\n  0.23    0.000806          14        54           getrusage\n  0.15    0.000540           8        63           sched_yield\n  0.13    0.000452          19        23           tgkill\n  0.07    0.000256          11        23        22 rt_sigreturn\n  0.04    0.000151          30         5           lstat\n  0.03    0.000090          22         4           stat\n  0.02    0.000054          27         2           chown\n  0.01    0.000039          19         2           fcntl\n  0.01    0.000021          21         1           geteuid\n------ ----------- ----------- --------- --------- ----------------\n100.00    0.351055          21     16516        52 total<\/code><\/pre>\n<p>We can see around <span style=\"color:red\">4000<\/span> executions for <span style=\"color:red\">select\/open\/read\/close system<\/span> calls. By the way, don&#8217;t get confused the by the low times in seconds &#8211; it&#8217;s only the CPU time consumed by the syscall, not its duration. The profile looks like a loop that opens a file, reads it, closes it and then waits for 1 ms before the next iteration.<\/p>\n<p>This pattern is visible in a more granular strace, where every syscall was traced.<\/p>\n<pre><code>sudo strace -o strace3.log -f -p 1857676<\/code><\/pre>\n<pre><code>...\n1857676 select(0, 0x7fff18135c90, 0x7fff18135c90, 0x7fff18135c90, {tv_sec=0, tv_usec=1000}) = 0 (Timeout)\n1857676 openat(AT_FDCWD, \"\/proc\/1857715\/stat\", O_RDONLY) = 11\n1857676 read(11, \"1857715 (ora_ckpt_dbc) S 1 18\"..., 999) = 332\n1857676 close(11)                       = 0\n1857676 select(0, 0x7fff18135c90, 0x7fff18135c90, 0x7fff18135c90, {tv_sec=0, tv_usec=1000}) = 0 (Timeout)\n1857676 openat(AT_FDCWD, \"\/proc\/1857715\/stat\", O_RDONLY) = 11\n1857676 read(11, \"1857715 (ora_ckpt_dbc) S 1 18\"..., 999) = 332\n1857676 close(11)                       = 0\n1857676 select(0, 0x7fff18135c90, 0x7fff18135c90, 0x7fff18135c90, {tv_sec=0, tv_usec=1000}) = 0 (Timeout)\n1857676 openat(AT_FDCWD, \"\/proc\/1857715\/stat\", O_RDONLY) = 11\n1857676 read(11, \"1857715 (ora_ckpt_dbc) S 1 18\"..., 999) = 332\n1857676 close(11)                       = 0\n1857676 select(0, 0x7fff18135c90, 0x7fff18135c90, 0x7fff18135c90, {tv_sec=0, tv_usec=1000}) = 0 (Timeout)\n1857676 openat(AT_FDCWD, \"\/proc\/1857715\/stat\", O_RDONLY) = 11\n1857676 read(11, \"1857715 (ora_ckpt_dbc) S 1 18\"..., 999) = 332\n1857676 close(11)                       = 0\n1857676 select(0, 0x7fff18135c90, 0x7fff18135c90, 0x7fff18135c90, {tv_sec=0, tv_usec=1000}) = 0 (Timeout)\n1857676 openat(AT_FDCWD, \"\/proc\/1857715\/stat\", O_RDONLY) = 11\n1857676 read(11, \"1857715 (ora_ckpt_dbc) S 1 18\"..., 999) = 332\n1857676 close(11)                       = 0\n...<\/code><\/pre>\n<p>The traced database writer was basically sampling \/proc\/PID\/stat file of the checkpoint process to generate some execution statistics:<\/p>\n<pre><code>ps -p 1857715\n    PID TTY          TIME CMD\n1857715 ?        00:05:25 ora_ckpt_dbc<\/code><\/pre>\n<p>Finally, I did some aggregations on the strace output:<\/p>\n<pre><code>strings strace3.log | grep open strace3.log | awk -F '\"' '{ print $2 }' | sort | uniq -c | sort -n -k 1<\/code><\/pre>\n<pre><code>...\n     12 \/proc\/1857683\/stat\n     14 \/proc\/1857597\/stat\n     14 \/proc\/1857641\/stat\n     14 \/proc\/1857689\/stat\n     14 \/proc\/1857705\/stat\n     15 \/proc\/1857623\/stat\n     15 \/proc\/1857633\/stat\n     15 \/proc\/1857655\/stat\n     15 \/proc\/1857666\/stat\n     15 \/proc\/1857685\/stat\n     15 \/proc\/1857696\/stat\n     16 \/proc\/1857586\/stat\n     16 \/proc\/1857588\/stat\n     16 \/proc\/1857600\/stat\n     16 \/proc\/1857608\/stat\n     16 \/proc\/1857619\/stat\n     16 \/proc\/1857657\/stat\n     16 \/proc\/1857663\/stat\n     16 \/proc\/1857668\/stat\n     16 \/proc\/1857674\/stat\n     16 \/proc\/1857692\/stat\n     16 \/proc\/1857699\/stat\n     16 \/proc\/1857701\/stat\n   <span style=\"color:red\">3634<\/span> \/proc\/1857715\/stat<\/code><\/pre>\n<p>Most \/proc\/PID\/stat samples (<span style=\"color:red\">3634<\/span>) were on the ckpt process (with PID 1857715). This number seems excessive considering the 1 ms break between each sample. The database writer was being blocked for several seconds just by waiting between samples.<\/p>\n<p>The rest of the reads were for other database writers, for example:<\/p>\n<pre><code>ps -p 1857701\n    PID TTY          TIME CMD\n1857701 ?        00:01:27 ora_dbwm_dbc\n\nps -p 1857699\n    PID TTY          TIME CMD\n1857699 ?        00:01:29 ora_dbwl_dbc<\/code><\/pre>\n<h1>Summary<\/h1>\n<p>A performance problem with log switches can trigger database writers to generate debug information. This includes taking thousands of samples of \/proc\/PID\/stat for the checkpoint process. Since there&#8217;s a 1 ms sleep between each sample, it can take seconds to collect all the debugging information. This non-DBWR activity distracts database writers from their main work &#8211; writing dirty blocks to files. The consequences can be fatal &#8211; we observed a database grinded to a halt on several occasions.<\/p>\n<p>The collection of diagnostic information is instrumented by the wait event &#8220;oradebug request completion&#8221;. If you see that the database writers are spending too much time in it, you can try increasing the undocumented parameter _log_switch_tracing_timeout to a much higher value, see <a href=\"https:\/\/nenadnoveljic.com\/blog\/perilous-new-undocumented-tracing-feature-in-oracle-21c\/\">my previous blog post<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Exploring the internals of the undocumented Oracle wait event &#8220;oradebug request completion&#8221; with eBPF. An example of an off-CPU analysis. <a href=\"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/\" class=\"more-link\">Continue Reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[53,5],"tags":[],"class_list":["post-4228","post","type-post","status-publish","format-standard","hentry","category-ebpf","category-oracle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>oradebug request completion - All-round Database Topics<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"oradebug request completion - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"Exploring the internals of the undocumented Oracle wait event &quot;oradebug request completion&quot; with eBPF. An example of an off-CPU analysis. Continue Reading &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2022-06-13T16:24:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-06-13T16:24:17+00:00\" \/>\n<meta name=\"author\" content=\"Nenad Noveljic\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@NenadNoveljic\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nenad Noveljic\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/oradebug-request-completion\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/oradebug-request-completion\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"oradebug request completion\",\"datePublished\":\"2022-06-13T16:24:14+00:00\",\"dateModified\":\"2022-06-13T16:24:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/oradebug-request-completion\\\/\"},\"wordCount\":973,\"commentCount\":0,\"articleSection\":[\"eBPF\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/oradebug-request-completion\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/oradebug-request-completion\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/oradebug-request-completion\\\/\",\"name\":\"oradebug request completion - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"datePublished\":\"2022-06-13T16:24:14+00:00\",\"dateModified\":\"2022-06-13T16:24:17+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/oradebug-request-completion\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/oradebug-request-completion\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/oradebug-request-completion\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"oradebug request completion\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\",\"name\":\"All-round Database Topics\",\"description\":\"Nenad Noveljic\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\",\"name\":\"Nenad Noveljic\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"caption\":\"Nenad Noveljic\"},\"sameAs\":[\"nenad-noveljic-9b746a6\",\"https:\\\/\\\/x.com\\\/NenadNoveljic\"],\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/author\\\/nenad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"oradebug request completion - All-round Database Topics","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/","og_locale":"en_US","og_type":"article","og_title":"oradebug request completion - All-round Database Topics","og_description":"Exploring the internals of the undocumented Oracle wait event \"oradebug request completion\" with eBPF. An example of an off-CPU analysis. Continue Reading &rarr;","og_url":"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/","og_site_name":"All-round Database Topics","article_published_time":"2022-06-13T16:24:14+00:00","article_modified_time":"2022-06-13T16:24:17+00:00","author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"oradebug request completion","datePublished":"2022-06-13T16:24:14+00:00","dateModified":"2022-06-13T16:24:17+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/"},"wordCount":973,"commentCount":0,"articleSection":["eBPF","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/","url":"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/","name":"oradebug request completion - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"datePublished":"2022-06-13T16:24:14+00:00","dateModified":"2022-06-13T16:24:17+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/oradebug-request-completion\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"oradebug request completion"}]},{"@type":"WebSite","@id":"https:\/\/nenadnoveljic.com\/blog\/#website","url":"https:\/\/nenadnoveljic.com\/blog\/","name":"All-round Database Topics","description":"Nenad Noveljic","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nenadnoveljic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa","name":"Nenad Noveljic","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","caption":"Nenad Noveljic"},"sameAs":["nenad-noveljic-9b746a6","https:\/\/x.com\/NenadNoveljic"],"url":"https:\/\/nenadnoveljic.com\/blog\/author\/nenad\/"}]}},"_links":{"self":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/4228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/comments?post=4228"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/4228\/revisions"}],"predecessor-version":[{"id":4243,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/4228\/revisions\/4243"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=4228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=4228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=4228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}