ext_profiler.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html>
  3. <head>
  4. <title>Profiler</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  6. <meta name="Copyright" content="Copyright (C) 2005-2018">
  7. <meta name="Language" content="en">
  8. <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
  9. <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
  10. </head>
  11. <body>
  12. <div id="site">
  13. <a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>
  14. </div>
  15. <div id="head">
  16. <h1>Profiler</h1>
  17. </div>
  18. <div id="nav">
  19. <ul><li>
  20. <a href="luajit.html">LuaJIT</a>
  21. <ul><li>
  22. <a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>
  23. </li><li>
  24. <a href="install.html">Installation</a>
  25. </li><li>
  26. <a href="running.html">Running</a>
  27. </li></ul>
  28. </li><li>
  29. <a href="extensions.html">Extensions</a>
  30. <ul><li>
  31. <a href="ext_ffi.html">FFI Library</a>
  32. <ul><li>
  33. <a href="ext_ffi_tutorial.html">FFI Tutorial</a>
  34. </li><li>
  35. <a href="ext_ffi_api.html">ffi.* API</a>
  36. </li><li>
  37. <a href="ext_ffi_semantics.html">FFI Semantics</a>
  38. </li></ul>
  39. </li><li>
  40. <a href="ext_jit.html">jit.* Library</a>
  41. </li><li>
  42. <a href="ext_c_api.html">Lua/C API</a>
  43. </li><li>
  44. <a class="current" href="ext_profiler.html">Profiler</a>
  45. </li></ul>
  46. </li><li>
  47. <a href="status.html">Status</a>
  48. <ul><li>
  49. <a href="changes.html">Changes</a>
  50. </li></ul>
  51. </li><li>
  52. <a href="faq.html">FAQ</a>
  53. </li><li>
  54. <a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>
  55. </li><li>
  56. <a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>
  57. </li><li>
  58. <a href="http://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>
  59. </li></ul>
  60. </div>
  61. <div id="main">
  62. <p>
  63. LuaJIT has an integrated statistical profiler with very low overhead. It
  64. allows sampling the currently executing stack and other parameters in
  65. regular intervals.
  66. </p>
  67. <p>
  68. The integrated profiler can be accessed from three levels:
  69. </p>
  70. <ul>
  71. <li>The <a href="#hl_profiler">bundled high-level profiler</a>, invoked by the
  72. <a href="#j_p"><tt>-jp</tt></a> command line option.</li>
  73. <li>A <a href="#ll_lua_api">low-level Lua API</a> to control the profiler.</li>
  74. <li>A <a href="#ll_c_api">low-level C API</a> to control the profiler.</li>
  75. </ul>
  76. <h2 id="hl_profiler">High-Level Profiler</h2>
  77. <p>
  78. The bundled high-level profiler offers basic profiling functionality. It
  79. generates simple textual summaries or source code annotations. It can be
  80. accessed with the <a href="#j_p"><tt>-jp</tt></a> command line option
  81. or from Lua code by loading the underlying <tt>jit.p</tt> module.
  82. </p>
  83. <p>
  84. To cut to the chase &mdash; run this to get a CPU usage profile by
  85. function name:
  86. </p>
  87. <pre class="code">
  88. luajit -jp myapp.lua
  89. </pre>
  90. <p>
  91. It's <em>not</em> a stated goal of the bundled profiler to add every
  92. possible option or to cater for special profiling needs. The low-level
  93. profiler APIs are documented below. They may be used by third-party
  94. authors to implement advanced functionality, e.g. IDE integration or
  95. graphical profilers.
  96. </p>
  97. <p>
  98. Note: Sampling works for both interpreted and JIT-compiled code. The
  99. results for JIT-compiled code may sometimes be surprising. LuaJIT
  100. heavily optimizes and inlines Lua code &mdash; there's no simple
  101. one-to-one correspondence between source code lines and the sampled
  102. machine code.
  103. </p>
  104. <h3 id="j_p"><tt>-jp=[options[,output]]</tt></h3>
  105. <p>
  106. The <tt>-jp</tt> command line option starts the high-level profiler.
  107. When the application run by the command line terminates, the profiler
  108. stops and writes the results to <tt>stdout</tt> or to the specified
  109. <tt>output</tt> file.
  110. </p>
  111. <p>
  112. The <tt>options</tt> argument specifies how the profiling is to be
  113. performed:
  114. </p>
  115. <ul>
  116. <li><tt>f</tt> &mdash; Stack dump: function name, otherwise module:line.
  117. This is the default mode.</li>
  118. <li><tt>F</tt> &mdash; Stack dump: ditto, but dump module:name.</li>
  119. <li><tt>l</tt> &mdash; Stack dump: module:line.</li>
  120. <li><tt>&lt;number&gt;</tt> &mdash; stack dump depth (callee &larr;
  121. caller). Default: 1.</li>
  122. <li><tt>-&lt;number&gt;</tt> &mdash; Inverse stack dump depth (caller
  123. &rarr; callee).</li>
  124. <li><tt>s</tt> &mdash; Split stack dump after first stack level. Implies
  125. depth&nbsp;&ge;&nbsp;2 or depth&nbsp;&le;&nbsp;-2.</li>
  126. <li><tt>p</tt> &mdash; Show full path for module names.</li>
  127. <li><tt>v</tt> &mdash; Show VM states.</li>
  128. <li><tt>z</tt> &mdash; Show <a href="#jit_zone">zones</a>.</li>
  129. <li><tt>r</tt> &mdash; Show raw sample counts. Default: show percentages.</li>
  130. <li><tt>a</tt> &mdash; Annotate excerpts from source code files.</li>
  131. <li><tt>A</tt> &mdash; Annotate complete source code files.</li>
  132. <li><tt>G</tt> &mdash; Produce raw output suitable for graphical tools.</li>
  133. <li><tt>m&lt;number&gt;</tt> &mdash; Minimum sample percentage to be shown.
  134. Default: 3%.</li>
  135. <li><tt>i&lt;number&gt;</tt> &mdash; Sampling interval in milliseconds.
  136. Default: 10ms.<br>
  137. Note: The actual sampling precision is OS-dependent.</li>
  138. </ul>
  139. <p>
  140. The default output for <tt>-jp</tt> is a list of the most CPU consuming
  141. spots in the application. Increasing the stack dump depth with (say)
  142. <tt>-jp=2</tt> may help to point out the main callers or callees of
  143. hotspots. But sample aggregation is still flat per unique stack dump.
  144. </p>
  145. <p>
  146. To get a two-level view (split view) of callers/callees, use
  147. <tt>-jp=s</tt> or <tt>-jp=-s</tt>. The percentages shown for the second
  148. level are relative to the first level.
  149. </p>
  150. <p>
  151. To see how much time is spent in each line relative to a function, use
  152. <tt>-jp=fl</tt>.
  153. </p>
  154. <p>
  155. To see how much time is spent in different VM states or
  156. <a href="#jit_zone">zones</a>, use <tt>-jp=v</tt> or <tt>-jp=z</tt>.
  157. </p>
  158. <p>
  159. Combinations of <tt>v/z</tt> with <tt>f/F/l</tt> produce two-level
  160. views, e.g. <tt>-jp=vf</tt> or <tt>-jp=fv</tt>. This shows the time
  161. spent in a VM state or zone vs. hotspots. This can be used to answer
  162. questions like "Which time consuming functions are only interpreted?" or
  163. "What's the garbage collector overhead for a specific function?".
  164. </p>
  165. <p>
  166. Multiple options can be combined &mdash; but not all combinations make
  167. sense, see above. E.g. <tt>-jp=3si4m1</tt> samples three stack levels
  168. deep in 4ms intervals and shows a split view of the CPU consuming
  169. functions and their callers with a 1% threshold.
  170. </p>
  171. <p>
  172. Source code annotations produced by <tt>-jp=a</tt> or <tt>-jp=A</tt> are
  173. always flat and at the line level. Obviously, the source code files need
  174. to be readable by the profiler script.
  175. </p>
  176. <p>
  177. The high-level profiler can also be started and stopped from Lua code with:
  178. </p>
  179. <pre class="code">
  180. require("jit.p").start(options, output)
  181. ...
  182. require("jit.p").stop()
  183. </pre>
  184. <h3 id="jit_zone"><tt>jit.zone</tt> &mdash; Zones</h3>
  185. <p>
  186. Zones can be used to provide information about different parts of an
  187. application to the high-level profiler. E.g. a game could make use of an
  188. <tt>"AI"</tt> zone, a <tt>"PHYS"</tt> zone, etc. Zones are hierarchical,
  189. organized as a stack.
  190. </p>
  191. <p>
  192. The <tt>jit.zone</tt> module needs to be loaded explicitly:
  193. </p>
  194. <pre class="code">
  195. local zone = require("jit.zone")
  196. </pre>
  197. <ul>
  198. <li><tt>zone("name")</tt> pushes a named zone to the zone stack.</li>
  199. <li><tt>zone()</tt> pops the current zone from the zone stack and
  200. returns its name.</li>
  201. <li><tt>zone:get()</tt> returns the current zone name or <tt>nil</tt>.</li>
  202. <li><tt>zone:flush()</tt> flushes the zone stack.</li>
  203. </ul>
  204. <p>
  205. To show the time spent in each zone use <tt>-jp=z</tt>. To show the time
  206. spent relative to hotspots use e.g. <tt>-jp=zf</tt> or <tt>-jp=fz</tt>.
  207. </p>
  208. <h2 id="ll_lua_api">Low-level Lua API</h2>
  209. <p>
  210. The <tt>jit.profile</tt> module gives access to the low-level API of the
  211. profiler from Lua code. This module needs to be loaded explicitly:
  212. <pre class="code">
  213. local profile = require("jit.profile")
  214. </pre>
  215. <p>
  216. This module can be used to implement your own higher-level profiler.
  217. A typical profiling run starts the profiler, captures stack dumps in
  218. the profiler callback, adds them to a hash table to aggregate the number
  219. of samples, stops the profiler and then analyzes all of the captured
  220. stack dumps. Other parameters can be sampled in the profiler callback,
  221. too. But it's important not to spend too much time in the callback,
  222. since this may skew the statistics.
  223. </p>
  224. <h3 id="profile_start"><tt>profile.start(mode, cb)</tt>
  225. &mdash; Start profiler</h3>
  226. <p>
  227. This function starts the profiler. The <tt>mode</tt> argument is a
  228. string holding options:
  229. </p>
  230. <ul>
  231. <li><tt>f</tt> &mdash; Profile with precision down to the function level.</li>
  232. <li><tt>l</tt> &mdash; Profile with precision down to the line level.</li>
  233. <li><tt>i&lt;number&gt;</tt> &mdash; Sampling interval in milliseconds (default
  234. 10ms).</br>
  235. Note: The actual sampling precision is OS-dependent.
  236. </li>
  237. </ul>
  238. <p>
  239. The <tt>cb</tt> argument is a callback function which is called with
  240. three arguments: <tt>(thread, samples, vmstate)</tt>. The callback is
  241. called on a separate coroutine, the <tt>thread</tt> argument is the
  242. state that holds the stack to sample for profiling. Note: do
  243. <em>not</em> modify the stack of that state or call functions on it.
  244. </p>
  245. <p>
  246. <tt>samples</tt> gives the number of accumulated samples since the last
  247. callback (usually 1).
  248. </p>
  249. <p>
  250. <tt>vmstate</tt> holds the VM state at the time the profiling timer
  251. triggered. This may or may not correspond to the state of the VM when
  252. the profiling callback is called. The state is either <tt>'N'</tt>
  253. native (compiled) code, <tt>'I'</tt> interpreted code, <tt>'C'</tt>
  254. C&nbsp;code, <tt>'G'</tt> the garbage collector, or <tt>'J'</tt> the JIT
  255. compiler.
  256. </p>
  257. <h3 id="profile_stop"><tt>profile.stop()</tt>
  258. &mdash; Stop profiler</h3>
  259. <p>
  260. This function stops the profiler.
  261. </p>
  262. <h3 id="profile_dump"><tt>dump = profile.dumpstack([thread,] fmt, depth)</tt>
  263. &mdash; Dump stack </h3>
  264. <p>
  265. This function allows taking stack dumps in an efficient manner. It
  266. returns a string with a stack dump for the <tt>thread</tt> (coroutine),
  267. formatted according to the <tt>fmt</tt> argument:
  268. </p>
  269. <ul>
  270. <li><tt>p</tt> &mdash; Preserve the full path for module names. Otherwise
  271. only the file name is used.</li>
  272. <li><tt>f</tt> &mdash; Dump the function name if it can be derived. Otherwise
  273. use module:line.</li>
  274. <li><tt>F</tt> &mdash; Ditto, but dump module:name.</li>
  275. <li><tt>l</tt> &mdash; Dump module:line.</li>
  276. <li><tt>Z</tt> &mdash; Zap the following characters for the last dumped
  277. frame.</li>
  278. <li>All other characters are added verbatim to the output string.</li>
  279. </ul>
  280. <p>
  281. The <tt>depth</tt> argument gives the number of frames to dump, starting
  282. at the topmost frame of the thread. A negative number dumps the frames in
  283. inverse order.
  284. </p>
  285. <p>
  286. The first example prints a list of the current module names and line
  287. numbers of up to 10 frames in separate lines. The second example prints
  288. semicolon-separated function names for all frames (up to 100) in inverse
  289. order:
  290. </p>
  291. <pre class="code">
  292. print(profile.dumpstack(thread, "l\n", 10))
  293. print(profile.dumpstack(thread, "lZ;", -100))
  294. </pre>
  295. <h2 id="ll_c_api">Low-level C API</h2>
  296. <p>
  297. The profiler can be controlled directly from C&nbsp;code, e.g. for
  298. use by IDEs. The declarations are in <tt>"luajit.h"</tt> (see
  299. <a href="ext_c_api.html">Lua/C API</a> extensions).
  300. </p>
  301. <h3 id="luaJIT_profile_start"><tt>luaJIT_profile_start(L, mode, cb, data)</tt>
  302. &mdash; Start profiler</h3>
  303. <p>
  304. This function starts the profiler. <a href="#profile_start">See
  305. above</a> for a description of the <tt>mode</tt> argument.
  306. </p>
  307. <p>
  308. The <tt>cb</tt> argument is a callback function with the following
  309. declaration:
  310. </p>
  311. <pre class="code">
  312. typedef void (*luaJIT_profile_callback)(void *data, lua_State *L,
  313. int samples, int vmstate);
  314. </pre>
  315. <p>
  316. <tt>data</tt> is available for use by the callback. <tt>L</tt> is the
  317. state that holds the stack to sample for profiling. Note: do
  318. <em>not</em> modify this stack or call functions on this stack &mdash;
  319. use a separate coroutine for this purpose. <a href="#profile_start">See
  320. above</a> for a description of <tt>samples</tt> and <tt>vmstate</tt>.
  321. </p>
  322. <h3 id="luaJIT_profile_stop"><tt>luaJIT_profile_stop(L)</tt>
  323. &mdash; Stop profiler</h3>
  324. <p>
  325. This function stops the profiler.
  326. </p>
  327. <h3 id="luaJIT_profile_dumpstack"><tt>p = luaJIT_profile_dumpstack(L, fmt, depth, len)</tt>
  328. &mdash; Dump stack </h3>
  329. <p>
  330. This function allows taking stack dumps in an efficient manner.
  331. <a href="#profile_dump">See above</a> for a description of <tt>fmt</tt>
  332. and <tt>depth</tt>.
  333. </p>
  334. <p>
  335. This function returns a <tt>const&nbsp;char&nbsp;*</tt> pointing to a
  336. private string buffer of the profiler. The <tt>int&nbsp;*len</tt>
  337. argument returns the length of the output string. The buffer is
  338. overwritten on the next call and deallocated when the profiler stops.
  339. You either need to consume the content immediately or copy it for later
  340. use.
  341. </p>
  342. <br class="flush">
  343. </div>
  344. <div id="foot">
  345. <hr class="hide">
  346. Copyright &copy; 2005-2018
  347. <span class="noprint">
  348. &middot;
  349. <a href="contact.html">Contact</a>
  350. </span>
  351. </div>
  352. </body>
  353. </html>