{"id":533,"date":"2016-04-03T15:07:24","date_gmt":"2016-04-03T15:07:24","guid":{"rendered":"http:\/\/nenadnoveljic.com\/blog\/?p=533"},"modified":"2018-05-17T16:16:50","modified_gmt":"2018-05-17T16:16:50","slug":"emulex-hba-driver-performance-measuring-latency","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/","title":{"rendered":"Emulex HBA Driver Performance Analysis (1) &#8211; Measuring Latency"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p>In this blog post series I will expose the methodology and DTrace scripts which I\u00a0developed for analyzing a latency problem on the HBA Emulex driver.<\/p>\n<p>In the case that you are facing\u00a0a problem with an I\/O subsystem, the analysis should be started on the higher levels of the I\/O stack. To get yourself familiarized with troubleshooting in this area, I recommend reading\u00a0<a href=\"https:\/\/www.joyent.com\/blog\/when-iostat-leads-you-astray\">Gregg Brandan&#8217;s blog<\/a> and his <a href=\"http:\/\/www.dtracebook.com\/index.php\/Main_Page\">Dtrace book<\/a> which has two chapters dedicated to analyzing I\/O problems.<\/p>\n<p>However, if you do the analysis down the I\/O stack and still\u00a0observe a high latency on block devices, this article might apply to your problem.\u00a0 In\u00a0today&#8217;s blog post\u00a0I will explain how to measure the end-to-end latency on the HBA driver.<\/p>\n<h1>SDT DTrace Probes<\/h1>\n<p>First, I looked if there are any existing\u00a0<a href=\"https:\/\/docs.oracle.com\/cd\/E36784_01\/html\/E36846\/gkyal.html#scrolltoc\">DTrace providers<\/a> for the HBA drivers, but I couldn&#8217;t find any.<\/p>\n<p>As the next best choice, I\u00a0looked for sdt (Statically Defined Tracing) providers, but no luck there as well:<\/p>\n<pre><code>dtrace -ln 'sdt:::' | grep emlxs<\/code><\/pre>\n<p>Note: emlxs is the name of the Emulex driver.<\/p>\n<p>Since the driver code has not been instrumented with the SDT probes,\u00a0the Function Boundary Tracing provider (fbt) has to be used. As the fbt provider\u00a0traces the execution of\u00a0raw kernel code, DTrace scripts that are based on it, may break between kernel and driver releases.<\/p>\n<h1>Stack Fishing for I\/O Start<\/h1>\n<p>As for the next step, the driver functions\u00a0that\u00a0initiate I\/O operations have to be identified. Therefore, I&#8217;ll collect the call stacks when any of the Emulex driver functions are being executed:<\/p>\n<pre><code>dtrace -n 'fbt:emlxs::entry { @[stack()] = count(); }'<\/code><\/pre>\n<p>I eyeballed the collected stack backtraces to identify the stack which initiates the transfer:<\/p>\n<pre><code>\r\n[...truncated...]\r\n emlxs`emlxs_sli4_prep_fcp_iocb+0xda\r\n  emlxs`emlxs_send_fcp_cmd+0x137\r\n  emlxs`emlxs_fca_transport+0x256\r\n  <span style=\"color: #ff0000;\">fctl`fc_ulp_transport<\/span>+0x22a\r\n  fcp`fcp_transport+0x27\r\n  fcp`fcp_scsi_start+0x149\r\n  scsi`scsi_transport+0x233\r\n  scsi_vhci`vhci_scsi_start+0x45d\r\n  scsi`scsi_transport+0x2b2\r\n  sd`sd_start_cmds+0x34f\r\n  sd`sd_core_iostart+0x186\r\n  sd`sd_mapblockaddr_iostart+0x1ef\r\n  sd`sd_xbuf_strategy+0x4e\r\n  sd`xbuf_iostart+0x1e2\r\n  sd`ddi_xbuf_qstrategy+0xd7\r\n  sd`sdstrategy+0x175\r\n  genunix`bdev_strategy+0x66\r\n  genunix`ldi_strategy+0x56\r\n  zfs`vdev_disk_strategy+0x158\r\n  zfs`vdev_disk_io_start+0x10c\r\n[...truncated...]\r\n<\/code><\/pre>\n<p>The stack was easily identified because it contains calls to the scsi_transport function. fctl`fc_ulp_transport is the first Solaris HBA generic driver function on the stack before the first emlxs call. Therefore, I&#8217;ll consider using the return boundary of this function for recording the I\/O start operations.<\/p>\n<h1>Stack Fishing for I\/O Done<\/h1>\n<p>The stack above cannot be used for identifying the complete stack of the I\/O done event, becuse the functions will be called in the reversed order, namely the emulex functions first and than the generic ones. However, we can use the I\/O start stack for identifying the module names of the functions which process the I\/O and then\u00a0collect stacks backtraces of all the functions involved in the I\/O operation:<\/p>\n<pre><code>dtrace -n 'fbt:emlxs::entry,fbt:scsi::entry,fbt:fctl::entry,fbt:fcp::entry { @[stack()] = count(); }'<\/code><\/pre>\n<p>Obviously, the functions destroying the packet\u00a0complete the IO:<\/p>\n<pre><code>[...truncated...]\r\n<span style=\"color: #ff0000;\">fctl`fc_ulp_uninit_packet<\/span>+0x2f\r\n\tfcp`fcp_pkt_teardown+0x8b\r\n\tscsi`scsi_cache_destroy_pkt+0x46\r\n\tscsi`scsi_destroy_pkt+0x21\r\n\tscsi_vhci`vhci_intr+0x7af\r\n\tscsi`scsi_hba_pkt_comp+0x293\r\n\tfcp`fcp_post_callback+0x19\r\n\tfcp`fcp_cmd_callback+0x72\r\n\temlxs`emlxs_handle_fcp_event+0x9fa\r\n\temlxs`emlxs_proc_channel_event+0x647\r\n\temlxs`emlxs_proc_channel+0x62\r\n\temlxs`emlxs_thread+0x169\r\n\tunix`thread_start+0x8\r\n[...truncated...]\r\n<\/code><\/pre>\n<p>The function fctl`fc_ulp_uninit_packet is close to the emulex driver functions on the I\/O completion stack, so it could be used for marking the end of the I\/O operation.<\/p>\n<h1>Cross-Checking by Counting Functions Calls<\/h1>\n<p>Let&#8217;s\u00a0check whether the number of the executions of the functions, that\u00a0have been\u00a0picked for measuring starting and finishing point of a single IO, match:<\/p>\n<pre><code>dtrace -n 'fbt:emlxs::entry,fbt:scsi::entry,fbt:fctl::entry,fbt:fcp::entry { @[probefunc] = count(); }'\r\n[...truncated...]\r\n  emlxs_fca_pkt_init                                            22356\r\n  emlxs_fca_pkt_uninit                                          22356\r\n  fc_ulp_init_packet                                            22356\r\n  <span style=\"color: #ff0000;\">fc_ulp_uninit_packet                                          22356\r\n<\/span>  fcp_pkt_setup                                                 22356\r\n  fcp_pkt_teardown                                              22356\r\n  emlxs_CQE_to_IOCB                                             22358\r\n  emlxs_check_dma                                               22358\r\n  emlxs_fca_transport                                           22358\r\n  emlxs_handle_fcp_event                                        22358\r\n  emlxs_initialize_pkt                                          22358\r\n  emlxs_msiid_to_chan                                           22358\r\n  emlxs_node_find_did                                           22358\r\n  emlxs_proc_channel_event                                      22358\r\n  emlxs_select_fcp_channel                                      22358\r\n  emlxs_select_msiid                                            22358\r\n  emlxs_send_fcp_cmd                                            22358\r\n  emlxs_sli4_alloc_xri                                          22358\r\n  emlxs_sli4_bde_setup                                          22358\r\n  emlxs_sli4_free_xri                                           22358\r\n  emlxs_sli4_prep_fcp_iocb                                      22358\r\n  emlxs_sli4_process_wqe_cmpl                                   22358\r\n  emlxs_sli4_write_wqdb                                         22358\r\n  emlxs_unswap_pkt                                              22358\r\n  emlxs_update_sd_bucket                                        22358\r\n  <span style=\"color: #ff0000;\">fc_ulp_transport                                              22358<\/span>\r\n  fcp_cmd_callback                                              22358\r\n  fcp_complete_pkt                                              22358\r\n  fcp_post_callback                                             22358\r\n  fcp_prepare_pkt                                               22358\r\n  fcp_reconfig_wait                                             22358\r\n  fcp_scsi_start                                                22358\r\n  fcp_transport                                                 22358\r\n  emlxs_mem_get                                                 22362\r\n  emlxs_mem_pool_get                                            22362\r\n  emlxs_mem_pool_put                                            22362\r\n  emlxs_mem_put                                                 22362\r\n  scsi_cache_destroy_pkt                                        22640\r\n  scsi_cache_dmafree_attr                                       22640\r\n  scsi_hba_pkt_alloc                                            22640\r\n  scsi_hba_pkt_free                                             22640\r\n  scsi_cache_init_pkt                                           22642\r\n  emlxs_sli4_cqid_to_index                                      22920\r\n  emlxs_sli4_msi_intr                                           22920\r\n  emlxs_sli4_process_cq                                         22920\r\n  emlxs_sli4_process_eq                                         22920\r\n  scsi_pkt2bp                                                   39577\r\n  emlxs_swap_fcp_pkt                                            44716\r\n  emlxs_tx_get                                                  44948\r\n  emlxs_sli4_issue_iocb_cmd                                     44983\r\n  scsi_destroy_pkt                                              45280\r\n  scsi_init_pkt                                                 45282\r\n  <span style=\"color: #000000;\">scsi_hba_pkt_comp                                             45286<\/span>\r\n  scsi_transport                                                45286\r\n  emlxs_sli4_write_cqdb                                         45840\r\n[...truncated...]\r\n<\/code><\/pre>\n<p>The output has confirmed that the number of executions of fctl`fc_ulp_uninit_packet and fctl`fc_ulp_transport are 22356 and 23358 respectively, which corresponds to the number of the I\/O operations during the observed time period. The small difference is attributable to two in-flight I\/O operations\u00a0that have not been finished yet, in the moment the count script was interrupted.<br \/>\nIt can also be seen that some of the the scsi functions get executed twice as many. The script <a href=\"http:\/\/www.dtracebook.com\/index.php\/Disk_IO:scsicmds.d\">scsicmds.d<\/a> helps to clarify this phenomenon:<\/p>\n<pre><code>[...truncated...]\r\n  fp                       synchronize_cache                     8712\r\n  scsi_vhci                synchronize_cache                     8712\r\n  fp                       read(10)                              14558\r\n  scsi_vhci                read(10)                              14586\r\n  fp                       write(10)                             21197\r\n  scsi_vhci                write(10)                             21886\r\n<\/code><\/pre>\n<p>Because of the multipathing (scsi_vhci) the scsi functions will be called twice.<\/p>\n<h1>Pairing\u00a0I\/O Start\u00a0with I\/O Done<\/h1>\n<p>A little difficulty in associating the I\/O start of a given paket with its I\/O done event is caused by the fact that I\/O start and I\/O done are not performed\u00a0within the\u00a0same thread. For the sake of efficiency, the thread gets off the CPU after an I\/O\u00a0was submitted. After receiving the data from storage, the\u00a0HBA device\u00a0sends an interrupt which afterwards get handled by another thread. As a consequence, the start time must be stored in an associative array instead in a thread variable. Thus, we need to find a unique key to access the start time once the I\/O gets finished. An appropriate key\u00a0can be identified by examining the function arguments of the both functions:<\/p>\n<pre><code>fctl.c:fc_ulp_transport(opaque_t port_handle, fc_packet_t *pkt)\r\nfctl.c:fc_ulp_uninit_packet(opaque_t port_handle, fc_packet_t *pkt)\r\n<\/code><\/pre>\n<p>The second argument, the address of the packet variable (pkt),\u00a0is unlikely\u00a0to change\u00a0during the whole life-cycle of the I\/O. Based on this assumption, I wrote the following dtrace script for measuring the latency on\u00a0the HBA driver:<\/p>\n<pre><code>#!\/usr\/sbin\/dtrace -s\r\n\r\n\/* hbalatency.d *\/\r\n\r\nfbt::fc_ulp_transport:entry\r\n{\r\n  start_time[arg1] = timestamp ;\r\n}\r\n\r\nfbt::fc_ulp_uninit_packet:entry\r\n\/ start_time[arg1] \/\r\n{\r\n  this-&gt;diff = (timestamp - start_time[arg1])\/1000000 ;\r\n  @[\"latency (ms)\"] = quantize(this-&gt;diff) ;\r\n  start_time[arg1] = 0 ;\r\n}\r\n<\/code><\/pre>\n<h1>Verification<\/h1>\n<p>hbalatency.d can be\u00a0verified by \u00a0<a href=\"https:\/\/blogs.oracle.com\/chrisg\/entry\/scsi_d_script\">scsi.d<\/a> .<\/p>\n<pre><code>dtrace -qCs scsi.d  -D QUIET -D PERF_REPORT \r\n  scsi_vhci                                                 0\r\n           value  ------------- Distribution ------------- count    \r\n              -1 |                                         0        \r\n               0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      368543   \r\n               1 |@@                                       16447    \r\n               2 |@                                        8801     \r\n               4 |@                                        12638    \r\n               8 |@                                        10302    \r\n              16 |                                         2190     \r\n              32 |                                         306      \r\n              64 |                                         87       \r\n             128 |                                         2        \r\n             256 |                                         0        \r\n\r\ndtrace -s hba_latency.d\r\n  latency (ms)                                      \r\n           value  ------------- Distribution ------------- count    \r\n              -1 |                                         0        \r\n               0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      356419   \r\n               1 |@@                                       15541    \r\n               2 |@                                        8432     \r\n               4 |@                                        12351    \r\n               8 |@                                        10079    \r\n              16 |                                         2081     \r\n              32 |                                         292      \r\n              64 |                                         70       \r\n             128 |                                         2        \r\n             256 |                                         0        \r\n\r\n<\/code><\/pre>\n<p>Note: I changed the time units from ns to ms in scsi.d.<br \/>\nIt seems to be a pretty good match. The minor differencies are attributable to very small delay in starting and initializing the script.<\/p>\n<h1>What\u00a0Do We\u00a0Measure?<\/h1>\n<p>The following\u00a0functional diagram\u00a0can be deduced from the collected stacks:<\/p>\n<p><a href=\"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2016\/04\/hba_stack.gif\" rel=\"attachment wp-att-543\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-543\" src=\"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2016\/04\/hba_stack.gif\" alt=\"hba_stack\" width=\"289\" height=\"570\" \/><\/a><\/p>\n<p>It should be kept in mind that\u00a0 the end-to-end\u00a0latency measured on the HBA device driver also contains round-trips to\u00a0storage.<\/p>\n<h1>Conclusion<\/h1>\n<p>In today&#8217;s blog post\u00a0I scratched the surface of the Emulex\u00a0HBA driver and\u00a0built\u00a0the script for measuring the latency on it. In the next installments I&#8217;ll\u00a0dig into the driver&#8217;s internals and provide DTrace scripts for instrumenting different parts of the processing chain.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The blog post describes how to measure latency on Emulex HBA driver. <a href=\"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/\" 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":[24,15,14],"tags":[],"class_list":["post-533","post","type-post","status-publish","format-standard","hentry","category-dtrace","category-emulex","category-solaris"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Emulex HBA Driver Performance Analysis (1) - Measuring Latency - All-round Database Topics<\/title>\n<meta name=\"description\" content=\"The blog post describes how to measure latency on Emulex HBA driver.\" \/>\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\/emulex-hba-driver-performance-measuring-latency\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Emulex HBA Driver Performance Analysis (1) - Measuring Latency - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"The blog post describes how to measure latency on Emulex HBA driver.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2016-04-03T15:07:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-05-17T16:16:50+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2016\/04\/hba_stack.gif\" \/>\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=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"Emulex HBA Driver Performance Analysis (1) &#8211; Measuring Latency\",\"datePublished\":\"2016-04-03T15:07:24+00:00\",\"dateModified\":\"2018-05-17T16:16:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/\"},\"wordCount\":904,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/nenadnoveljic.com\\\/blog\\\/wp-content\\\/uploads\\\/2016\\\/04\\\/hba_stack.gif\",\"articleSection\":[\"DTrace\",\"Emulex\",\"Solaris\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/\",\"name\":\"Emulex HBA Driver Performance Analysis (1) - Measuring Latency - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/nenadnoveljic.com\\\/blog\\\/wp-content\\\/uploads\\\/2016\\\/04\\\/hba_stack.gif\",\"datePublished\":\"2016-04-03T15:07:24+00:00\",\"dateModified\":\"2018-05-17T16:16:50+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"description\":\"The blog post describes how to measure latency on Emulex HBA driver.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/#primaryimage\",\"url\":\"http:\\\/\\\/nenadnoveljic.com\\\/blog\\\/wp-content\\\/uploads\\\/2016\\\/04\\\/hba_stack.gif\",\"contentUrl\":\"http:\\\/\\\/nenadnoveljic.com\\\/blog\\\/wp-content\\\/uploads\\\/2016\\\/04\\\/hba_stack.gif\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/emulex-hba-driver-performance-measuring-latency\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Emulex HBA Driver Performance Analysis (1) &#8211; Measuring Latency\"}]},{\"@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":"Emulex HBA Driver Performance Analysis (1) - Measuring Latency - All-round Database Topics","description":"The blog post describes how to measure latency on Emulex HBA driver.","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\/emulex-hba-driver-performance-measuring-latency\/","og_locale":"en_US","og_type":"article","og_title":"Emulex HBA Driver Performance Analysis (1) - Measuring Latency - All-round Database Topics","og_description":"The blog post describes how to measure latency on Emulex HBA driver.","og_url":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/","og_site_name":"All-round Database Topics","article_published_time":"2016-04-03T15:07:24+00:00","article_modified_time":"2018-05-17T16:16:50+00:00","og_image":[{"url":"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2016\/04\/hba_stack.gif","type":"","width":"","height":""}],"author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"Emulex HBA Driver Performance Analysis (1) &#8211; Measuring Latency","datePublished":"2016-04-03T15:07:24+00:00","dateModified":"2018-05-17T16:16:50+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/"},"wordCount":904,"commentCount":0,"image":{"@id":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/#primaryimage"},"thumbnailUrl":"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2016\/04\/hba_stack.gif","articleSection":["DTrace","Emulex","Solaris"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/","url":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/","name":"Emulex HBA Driver Performance Analysis (1) - Measuring Latency - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/#primaryimage"},"image":{"@id":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/#primaryimage"},"thumbnailUrl":"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2016\/04\/hba_stack.gif","datePublished":"2016-04-03T15:07:24+00:00","dateModified":"2018-05-17T16:16:50+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"description":"The blog post describes how to measure latency on Emulex HBA driver.","breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/#primaryimage","url":"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2016\/04\/hba_stack.gif","contentUrl":"http:\/\/nenadnoveljic.com\/blog\/wp-content\/uploads\/2016\/04\/hba_stack.gif"},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/emulex-hba-driver-performance-measuring-latency\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Emulex HBA Driver Performance Analysis (1) &#8211; Measuring Latency"}]},{"@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\/533","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=533"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/533\/revisions"}],"predecessor-version":[{"id":582,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/533\/revisions\/582"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}