<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:DengXian;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@DengXian";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle19
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Hi Vadim,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks for your finding. The size is updated after previous io request. This method is correct and better.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">BR,<o:p></o:p></p>
<p class="MsoNormal">Ping<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Vadim Fedorenko <vadimjunk@gmail.com> <br>
<b>Sent:</b> Monday, February 22, 2021 5:55 AM<br>
<b>To:</b> nginx-devel@nginx.org<br>
<b>Cc:</b> Zhao, Ping <ping.zhao@intel.com><br>
<b>Subject:</b> Re: [PATCH] Add io_uring support in AIO(async io) module<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">Hi!<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Looks like this small fix doesn't work in case when the total size of the file is less than the size of the buffer and it was partly read.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">In my case the size of the file is 16384 bytes and only one page of the file was in page cache. This patch produces size = 8192 bytes<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">for my case and the next call reads 12288 bytes and generates errors like below:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">"<span style="font-family:"Courier New";color:black;background:white">[alert] 28441#28441: *20855 pread() read only 12288 of 8192 from <filename>"</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">changing to </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">size = ngx_min(size, dst->end - dst->last);</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">fixes the problem</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">Thanks,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">Vadim</span><o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">пн, 25 янв. 2021 г. в 08:25, Zhao, Ping <<a href="mailto:ping.zhao@intel.com">ping.zhao@intel.com</a>>:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">Hello, add a small update to correct the length when part of request already received in previous.<br>
This case may happen when using io_uring and throughput increased.<br>
<br>
# HG changeset patch<br>
# User Ping Zhao <<a href="mailto:ping.zhao@intel.com" target="_blank">ping.zhao@intel.com</a>><br>
# Date 1611566408 18000<br>
#      Mon Jan 25 04:20:08 2021 -0500<br>
# Node ID f2c91860b7ac4b374fff4353a830cd9427e1d027<br>
# Parent  1372f9ee2e829b5de5d12c05713c307e325e0369<br>
Correct length calculation when part of request received.<br>
<br>
diff -r 1372f9ee2e82 -r f2c91860b7ac src/core/ngx_output_chain.c<br>
--- a/src/core/ngx_output_chain.c       Wed Jan 13 11:10:05 2021 -0500<br>
+++ b/src/core/ngx_output_chain.c       Mon Jan 25 04:20:08 2021 -0500<br>
@@ -531,6 +531,14 @@<br>
<br>
     size = ngx_buf_size(src);<br>
     size = ngx_min(size, dst->end - dst->pos);<br>
+#if (NGX_HAVE_FILE_IOURING)<br>
+    /*<br>
+     * check if already received part of the request in previous,<br>
+     * calculate the remain length<br>
+     */<br>
+    if(dst->last > dst->pos && size > (dst->last - dst->pos))<br>
+        size = size - (dst->last - dst->pos);<br>
+#endif<br>
<br>
     sendfile = ctx->sendfile && !ctx->directio;<br>
<br>
-----Original Message-----<br>
From: nginx-devel <<a href="mailto:nginx-devel-bounces@nginx.org" target="_blank">nginx-devel-bounces@nginx.org</a>> On Behalf Of Zhao, Ping<br>
Sent: Thursday, January 21, 2021 9:44 AM<br>
To: <a href="mailto:nginx-devel@nginx.org" target="_blank">nginx-devel@nginx.org</a><br>
Subject: RE: [PATCH] Add io_uring support in AIO(async io) module<br>
<br>
Hi Vladimir,<br>
<br>
No special/extra configuration needed, but need check if 'aio on' and 'sendfile off' is correctly set. This is my Nginx config for reference:<br>
<br>
user nobody;<br>
daemon off;<br>
worker_processes 1;<br>
error_log error.log ;<br>
events {<br>
    worker_connections 65535;<br>
    use epoll;<br>
}<br>
<br>
http {<br>
    include mime.types;<br>
    default_type application/octet-stream;<br>
    access_log on;<br>
    aio on;<br>
    sendfile off;<br>
    directio 2k;<br>
<br>
    # Cache Configurations<br>
    proxy_cache_path /mnt/cache0 levels=2 keys_zone=nginx-cache0:400m max_size=1400g inactive=4d use_temp_path=off; ......<br>
<br>
<br>
To better measure the disk io performance data, I do the following steps:<br>
1. To exclude other impact, and focus on disk io part.(This patch only impact disk aio read process) Use cgroup to limit Nginx memory usage. Otherwise Nginx may also use memory as cache storage and this may cause test result not so straight.(since most cache
 hit in memory, disk io bw is low, like my previous mail found which didn't exclude the memory cache impact)<br>
     echo 2G > memory.limit_in_bytes<br>
     use ' cgexec -g memory:nginx' to start Nginx.<br>
<br>
2. use wrk -t 100 -c 1000, with random 25000 http requests. <br>
     My previous test used -t 200 connections, comparing with -t 1000, libaio performance drop more when connections numbers increased from 200 to 1000, but io_uring doesn't. It's another advantage of io_uring.<br>
<br>
3. First clean the cache disk and run the test for 30 minutes to let Nginx store the cache files to nvme disk as much as possible.<br>
<br>
4. Rerun the test, this time Nginx will use ngx_file_aio_read to extract the cache files in nvme cache disk. Use iostat to track the io data. The data should be align with NIC bw since all data should be from cache disk.(need exclude memory as cache storage
 impact)<br>
<br>
Following is the test result:<br>
<br>
Nginx worker_processes 1:<br>
                4k              100k            1M<br>
Io_uring        220MB/s 1GB/s           1.3GB/s<br>
Libaio          70MB/s          250MB/s 600MB/s(with -c 200, 1.0GB/s)<br>
<br>
<br>
Nginx worker_processes 4:<br>
                4k              100k            1M<br>
Io_uring        800MB/s 2.5GB/s         2.6GB/s(my nvme disk io maximum bw)<br>
libaio          250MB/s 900MB/s 2.0GB/s<br>
<br>
So for small request, io_uring has huge improvement than libaio. In previous mail, because I didn't exclude the memory cache storage impact, most cache file is stored in memory, very few are from disk in case of 4k/100k. The data is not correct.(for 1M, because
 the cache is too big to store in memory, it wat in disk)  Also I enabled directio option "directio 2k" this time to avoid this.<br>
<br>
Regards,<br>
Ping<br>
<br>
-----Original Message-----<br>
From: nginx-devel <<a href="mailto:nginx-devel-bounces@nginx.org" target="_blank">nginx-devel-bounces@nginx.org</a>> On Behalf Of Vladimir Homutov<br>
Sent: Wednesday, January 20, 2021 12:43 AM<br>
To: <a href="mailto:nginx-devel@nginx.org" target="_blank">nginx-devel@nginx.org</a><br>
Subject: Re: [PATCH] Add io_uring support in AIO(async io) module<br>
<br>
On Tue, Jan 19, 2021 at 03:32:30AM +0000, Zhao, Ping wrote:<br>
> It depends on if disk io is the performance hot spot or not. If yes, <br>
> io_uring shows improvement than libaio. With 4KB/100KB length 1 Nginx <br>
> thread it's hard to see performance difference because iostat is only <br>
> around ~10MB/100MB per second. Disk io is not the performance bottle <br>
> neck, both libaio and io_uring have the same performance. If you <br>
> increase request size or Nginx threads number, for example 1MB length <br>
> or Nginx thread number 4. In this case, disk io became the performance <br>
> bottle neck, you will see io_uring performance improvement.<br>
<br>
Can you please provide full test results with specific nginx configuration?<br>
<br>
_______________________________________________<br>
nginx-devel mailing list<br>
<a href="mailto:nginx-devel@nginx.org" target="_blank">nginx-devel@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-devel" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-devel</a><br>
_______________________________________________<br>
nginx-devel mailing list<br>
<a href="mailto:nginx-devel@nginx.org" target="_blank">nginx-devel@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-devel" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-devel</a><br>
_______________________________________________<br>
nginx-devel mailing list<br>
<a href="mailto:nginx-devel@nginx.org" target="_blank">nginx-devel@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-devel" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-devel</a><o:p></o:p></p>
</blockquote>
</div>
</div>
</body>
</html>