Hi Mikhail, Yes, io_uring can help Nginx achieve same performance with lower resource cost. This is the key improvement of io_uring I think. It can't break through the HW limitation.
BR, Ping -----Original Message----- From: nginx-devel <nginx-devel-boun...@nginx.org> On Behalf Of Mikhail Isachenkov Sent: Friday, February 26, 2021 4:41 PM To: nginx-devel@nginx.org Subject: Re: [PATCH] Add io_uring support in AIO(async io) module Hi Zhao Ping, I created i3en.6xlarge instance, 2 SSDs with 250k iops each (in raid0) and reproduced your results. Please find dstat output below. 1 worker, io_uring: usr sys idl wai stl| read writ| recv send| in out | int csw 4 4 92 0 0|1412M 0 |5742k 1484M| 0 0 | 244k 87k 1 worker, libaio: usr sys idl wai stl| read writ| recv send| in out | int csw 1 1 95 3 0| 276M 0 |1386k 289M| 0 0 | 50k 8961 4 workers, io_uring: usr sys idl wai stl| read writ| recv send| in out | int csw 6 6 18 70 0|1349M 0 |7240k 1445M| 0 0 | 296k 120k 4 workers, libaio: usr sys idl wai stl| read writ| recv send| in out | int csw 3 2 82 13 0| 890M 0 |3570k 931M| 0 0 | 139k 31k I ran test on i3.metal instance too (with 8 SSD in raid0), results are different but io_uring still faster: 1 worker, io_uring: usr sys idl wai stl| read writ| recv send| in out | int csw 1 2 97 0 0|1372M 0 |5845k 1442M| 0 0 | 168k 51k 1 worker, libaio: usr sys idl wai stl| read writ| recv send| in out | int csw 1 1 98 0 0| 972M 20k|4083k 1023M| 0 0 | 126k 2014 4 workers, io_uring: usr sys idl wai stl| read writ| recv send| in out | int csw 3 4 92 0 0|2211M 0 |9314k 2346M| 0 0 | 251k 198k 4 workers, libaio: usr sys idl wai stl| read writ| recv send| in out | int csw 3 3 94 0 0|1867M 0 | 10M 1995M| 0 0 | 220k 38k There is no difference between libaio and io_uring with a large number of worker processes (>=12). 26.02.2021 04:22, Zhao, Ping пишет: > Hi Mikhail, > > My Nvme SSD reports 562k IOPS with bs 4k, 128 depth using io_uring. > > ./fio -name=fiotest -filename=/dev/nvme2n1 -iodepth=128 -thread > -rw=randread -ioengine=io_uring -sqthread_poll=1 -direct=1 -bs=4k > -size=10G -numjobs=1 -runtime=600 -group_reporting > > Jobs: 1 (f=1): [r(1)][100.0%][r=2173MiB/s][r=556k IOPS][eta 00m:00s] > fiotest: (groupid=0, jobs=1): err= 0: pid=23828: Fri Feb 26 03:55:40 2021 > read: IOPS=562k, BW=2196MiB/s (2303MB/s)(10.0GiB/4663msec) > > BR, > Ping > > -----Original Message----- > From: nginx-devel <nginx-devel-boun...@nginx.org> On Behalf Of Mikhail > Isachenkov > Sent: Thursday, February 25, 2021 7:01 PM > To: nginx-devel@nginx.org > Subject: Re: [PATCH] Add io_uring support in AIO(async io) module > > Hi Zhao Ping, > > Looks like general-purpose AWS EC2 instances does not optimized to high > random I/O even with NVMe SSD; I'll try to test it again on bare-metal, > storage-optimized instance. > > How many 4k random iops your storage can handle? (I'd like to run test on the > instance with the same storage performance, according to > https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/storage-optimized-instances.html#i2-instances-diskperf). > > Thanks in advance! > > 25.02.2021 09:59, Zhao, Ping пишет: >> Hi Mikhail, >> >> I tried with CentOS 8.1.1911 + fedora-kernel-5.10.10-200.fc33, and with your >> test steps & scripts: >> >> 1. Created 90k files on nvme SSD with each size 100KB. >> 2. Created separate cgroup 'nginx': mkdir /sys/fs/cgroup/memory/nginx >> 3. Limit Nginx to 2GB: echo 2G > >> /sys/fs/cgroup/memory/nginx/memory.limit_in_bytes >> 4. Clear cache: echo 3 > /proc/sys/vm/drop_caches 5. Start nginx: >> cgexec -g memory:nginx 6. Tested with wrk on client: ./wrk -d 30 -t >> 100 -c 1000 -s add_random.lua http://... >> >> Io_uring can achieved 1.9+GB/s >> usr sys idl wai stl| read writ| recv send| in out | int csw >> 1 2 97 0 0|1923M 0 |7369k 2136M| 0 0 | 263k 119k >> 1 2 97 0 0|1911M 0 |7329k 2123M| 0 0 | 262k 119k >> 1 2 97 0 0|1910M 3592k|7318k 2118M| 0 0 | 264k 117k >> 1 2 97 0 0|1923M 200k|7353k 2138M| 0 0 | 265k 118k >> 1 2 97 0 0|1929M 0 |7376k 2142M| 0 0 | 264k 118k >> 1 2 97 0 0|1924M 32k|7352k 2140M| 0 0 | 265k 118k >> 1 2 97 0 0|1913M 0 |7320k 2122M| 0 0 | 263k 117k >> 1 2 97 0 0|1921M 3544k|7336k 2132M| 0 0 | 264k 118k >> 1 2 97 0 0|1933M 0 |7353k 2146M| 0 0 | 264k 120k >> >> Libaio is 260+MB/s >> usr sys idl wai stl| read writ| recv send| in out | int csw >> 0 0 98 1 0| 267M 0 |1022k 293M| 0 0 | 41k 12k >> 0 0 98 1 0| 279M 740k|1093k 314M| 0 0 | 42k 12k >> 1 0 98 1 0| 268M 0 |1013k 294M| 0 0 | 41k 12k >> 0 0 98 1 0| 261M 0 |1002k 294M| 0 0 | 41k 12k >> 1 0 98 1 0| 285M 0 |1057k 310M| 0 0 | 43k 13k >> 0 0 98 1 0| 276M 4096B|1038k 307M| 0 0 | 42k 13k >> 0 0 98 1 0| 273M 780k|1019k 303M| 0 0 | 42k 12k >> 1 0 98 1 0| 275M 0 |1016k 305M| 0 0 | 42k 12k >> 0 0 98 1 0| 254M 0 | 976k 294M| 0 0 | 40k 12k >> 0 0 98 1 0| 265M 0 | 975k 293M| 0 0 | 41k 12k >> 0 0 98 1 0| 269M 0 | 976k 295M| 0 0 | 41k 12k >> >> Comparing with your dstat data that disk read keeps at 250M/s, is there >> anything locked the disk io bw? >> >> Regards, >> Ping >> >> -----Original Message----- >> From: nginx-devel <nginx-devel-boun...@nginx.org> On Behalf Of >> Mikhail Isachenkov >> Sent: Tuesday, February 9, 2021 9:31 PM >> To: nginx-devel@nginx.org >> Subject: Re: [PATCH] Add io_uring support in AIO(async io) module >> >> Hi Zhao Ping, >> >> Unfortunately, I still couldn't reproduce these results. Maybe you could >> point me where I'm wrong? Please find my steps below and configuration/lua >> script for wrk attached. >> >> 1. Create 90k files on SSD on Amazon EC2 instance. I created 1k, 100k, 1M >> files. >> 2. Create separate cgroup 'nginx': mkdir /sys/fs/cgroup/memory/nginx >> 3. Limit memory to 80 Mb, for example: echo >> 80M>/sys/fs/cgroup/memory/nginx/memory.limit_in_bytes >> 4. Disable limit for locked memory: ulimit -l unlimited 5. Start nginx: >> cgexec -g memory:nginx /usr/local/sbin/nginx 6. Run wrk on client: ./wrk -d >> 30 -t 100 -c 1000 -s add_random.lua http://... >> >> I tried different values for limit_in_bytes (from 80M to 2G) and different >> file sizes -- 1k, 100k, 1M. In fact, maximum bandwidth is the same with >> libaio and io_uring. >> >> For example, with 100kb files and 1 worker process: >> >> free -lh >> total used free shared buff/cache >> available >> Mem: 15Gi 212Mi 14Gi 13Mi 318Mi >> 14Gi >> >> dstat/libaio >> 5 6 73 17 0| 251M 0 |1253k 265M| 0 0 | 33k 1721 >> 4 4 73 17 0| 250M 0 |1267k 264M| 0 0 | 33k 1739 >> 6 5 72 16 0| 250M 924k|1308k 270M| 0 0 | 34k 2017 >> 5 5 72 17 0| 250M 0 |1277k 258M| 0 0 | 34k 1945 >> 5 5 73 17 0| 250M 0 |1215k 263M| 0 0 | 33k 1720 >> 5 5 72 16 0| 250M 0 |1311k 267M| 0 0 | 34k 1721 >> 5 5 73 16 0| 250M 0 |1280k 264M| 0 0 | 34k 1718 >> 6 6 72 16 0| 250M 24k|1362k 268M| 0 0 | 35k 1825 >> 5 5 73 17 0| 250M 0 |1342k 262M| 0 0 | 34k 1726 >> dstat/io_uring >> 5 6 60 29 0| 250M 0 |1079k 226M| 0 0 | 36k 10k >> 5 6 64 25 0| 251M 0 | 906k 204M| 0 0 | 32k 8607 >> 4 6 62 27 0| 250M 0 |1034k 221M| 0 0 | 35k 10k >> 5 6 63 26 0| 250M 20k| 909k 209M| 0 0 | 32k 8595 >> 4 6 62 27 0| 250M 0 |1003k 217M| 0 0 | 35k 10k >> 4 5 61 28 0| 250M 0 |1019k 226M| 0 0 | 35k 9700 >> 4 5 62 27 0| 250M 0 | 948k 210M| 0 0 | 32k 8433 >> 4 6 61 28 0| 250M 0 |1094k 216M| 0 0 | 35k 9811 >> 5 6 62 26 0| 250M 0 |1083k 226M| 0 0 | 35k 9479 >> >> As you can see, libaio even faster a bit. >> >> 09.02.2021 11:36, Zhao, Ping пишет: >>> Hi Mikhail, >>> >>> The performance improvement of Io_uring vs. libaio locates at disk io >>> interface. So it needs exclude other factors when test, such as memory >>> cache storage which is much faster than disk io. >>> >>> If I didn't use memory limitation, libaio and io_uring network bandwidth is >>> very close because both of them use memory as cache file location, so we >>> can't see the disk io change from it. In following data, as example, it >>> used 17G memory as cache, network speed is same of io_uring and libaio, >>> both of them has very few disk io load, which means very low >>> io_uring/libaio usage. >>> >>> memory >>> free -lh >>> total used free shared buff/cache >>> available >>> Mem: 376Gi 3.2Gi 356Gi 209Mi 17Gi >>> 370Gi >>> >>> libaio: >>> ----total-usage---- -dsk/total- -net/total- ---paging-- ---system-- >>> usr sys idl wai stl| read writ| recv send| in out | int csw >>> 1 1 99 0 0|4097B 80k|4554k 104M| 0 0 | 77k 1344 >>> 1 1 98 0 0|8192B 104k|9955k 236M| 0 0 | 151k 1449 >>> 1 1 97 0 0| 56k 32k| 10M 241M| 0 0 | 148k 1652 >>> 2 1 97 0 0| 16k 16k|9552k 223M| 0 0 | 142k 1366 >>> 1 1 97 0 0| 16k 24k|9959k 234M| 0 0 | 146k 1570 >>> 1 1 97 0 0| 0 1064k| 10M 237M| 0 0 | 150k 1472 >>> 2 1 97 0 0| 16k 48k|9650k 227M| 0 0 | 143k 1555 >>> 2 1 97 0 0| 12k 16k|9185k 216M| 0 0 | 139k 1304 >>> >>> Io_uring: >>> ----total-usage---- -dsk/total- -net/total- ---paging-- ---system-- >>> usr sys idl wai stl| read writ| recv send| in out | int csw >>> 2 1 97 0 0| 0 0 |9866k 232M| 0 0 | 148k 1286 >>> 2 1 97 0 0| 0 0 |9388k 220M| 0 0 | 144k 1345 >>> 2 1 97 0 0| 0 0 |9080k 213M| 0 0 | 137k 1388 >>> 2 1 97 0 0| 0 0 |9611k 226M| 0 0 | 144k 1615 >>> 1 1 97 0 0| 0 232k|9830k 231M| 0 0 | 147k 1524 >>> >>> I used a Intel Xeon server Platinum 8280L CPU @ 2.70GHz, with 376G memory, >>> 50G network. If I limit nginx memory to 2GB, the cache memory will be about >>> 2.6G and won't increase during test. And disk io speed is close to network >>> speed which means this can shows the disk io change of libaio vs. io_uring. >>> This shows io_uring performance improvement. My previous data is based on >>> this configuration. >>> >>> Memory: >>> free -lh >>> total used free shared buff/cache >>> available >>> Mem: 376Gi 3.2Gi 370Gi 141Mi 2.6Gi >>> 370Gi >>> >>> Libaio: >>> ----total-usage---- -dsk/total- -net/total- ---paging-- ---system-- >>> usr sys idl wai stl| read writ| recv send| in out | int csw >>> 1 0 98 1 0| 60M 0 |2925k 68M| 0 0 | 50k 16k >>> 1 0 98 1 0| 60M 8192B|2923k 68M| 0 0 | 50k 16k >>> 1 0 98 1 0| 61M 0 |2923k 68M| 0 0 | 50k 16k >>> 0 0 98 1 0| 60M 0 |2929k 68M| 0 0 | 50k 16k >>> 1 0 98 1 0| 60M 264k|2984k 69M| 0 0 | 51k 16k >>> >>> Io_uring: >>> ----total-usage---- -dsk/total- -net/total- ---paging-- ---system-- >>> usr sys idl wai stl| read writ| recv send| in out | int csw >>> 1 2 93 4 0| 192M 8192B|7951k 187M| 0 0 | 146k 90k >>> 1 2 93 4 0| 196M 0 |7953k 187M| 0 0 | 144k 89k >>> 1 2 93 4 0| 191M 300k|7854k 185M| 0 0 | 145k 87k >>> 1 2 94 3 0| 186M 8192B|7861k 185M| 0 0 | 143k 86k >>> 1 2 94 3 0| 180M 16k|7995k 188M| 0 0 | 146k 86k >>> 2 1 94 3 0| 163M 16k|7273k 171M| 0 0 | 133k 80k >>> 1 1 94 3 0| 173M 1308k|7995k 188M| 0 0 | 144k 83k >>> >>> Considering that server memory won't be always enough for cache storage >>> when traffic increased and then Nginx will use disk as cache storage. In >>> this case, io_uring will shows big performance improvement than libaio on >>> disk io interface. This is the value of this patch. >>> >>> BR, >>> Ping >>> >>> -----Original Message----- >>> From: nginx-devel <nginx-devel-boun...@nginx.org> On Behalf Of >>> Mikhail Isachenkov >>> Sent: Tuesday, February 9, 2021 1:17 AM >>> To: nginx-devel@nginx.org >>> Subject: Re: [PATCH] Add io_uring support in AIO(async io) module >>> >>> Hi Zhao Ping, >>> >>> First of all, thank you for pointing me to AWS patch -- on Fedora 33 with >>> 5.10 kernel I don't see any errors now. >>> >>> I've tested patch on Amazon EC2 NVMe SSD (and found this drive pretty >>> fast!). Server is i3en.xlarge, client is c5n.2xlarge instance type, with up >>> to 25 Gigabit network. >>> >>> As in previous test, I've created a number of 100kb files, but try to reach >>> them via proxy_cache as on your stand. After warming up disk cache, I've >>> got the following results: >>> >>> a) with 4 worker processes, I've got 3Gb/sec in all tests regardless of >>> sendfile/libaio/io_uring. >>> >>> b) with 1 worker process, sendfile is faster (up to 1.9 Gb/sec) than libaio >>> (1.40 Gb/sec) and io_uring (up to 1.45 Gb/sec). >>> >>> I didn't use any memory limitations, but I ran 'echo 3 > >>> /proc/sys/vm/drop_caches' before each pass. When I try to limit memory to >>> 2G with cgroups, results are generally the same. Maybe 2G is not enough? >>> >>> Could you please run the test for ~60 seconds, and run 'dstat' on other >>> console? I'd like to check disk and network bandwidth at the same >>> timestamps and compare them to mine. >>> >>> Thanks in advance! >>> >>> 07.02.2021 05:16, Zhao, Ping пишет: >>>> Hi Mikhail, >>>> >>>> I reproduced your problem with kernel 5.8.0-1010-aws. And I tried >>>> kernel 5.8.0 which doesn't has this problem. I can confirm there's >>>> a regression of aws patch(linux-aws_5.8.0-1010.10.diff) >>>> >>>> Updated 'sendfile on' & 'aio off' test result with 4KB data which is >>>> almost same as libaio: >>>> >>>> Nginx worker_processes 1: >>>> 4k 100k 1M >>>> Io_uring 220MB/s 1GB/s 1.3GB/s >>>> Libaio 70MB/s 250MB/s 600MB/s(with -c 200, 1.0GB/s) >>>> sendfile 70MB/s 260MB/s 700MB/s >>>> >>>> >>>> Nginx worker_processes 4: >>>> 4k 100k 1M >>>> Io_uring 800MB/s 2.5GB/s 2.6GB/s(my nvme disk io maximum bw) >>>> libaio 250MB/s 900MB/s 2.0GB/s >>>> sendfile 250MB/s 900MB/s 1.6GB/s >>>> >>>> BR, >>>> Ping >>>> >>>> -----Original Message----- >>>> From: Zhao, Ping >>>> Sent: Friday, February 5, 2021 2:43 PM >>>> To: nginx-devel@nginx.org >>>> Subject: RE: [PATCH] Add io_uring support in AIO(async io) module >>>> >>>> Hi Mikhail, >>>> >>>> Added 'sendfile on' & 'aio off' test result with previous table: >>>> >>>> Following is the test result with 100KB and 1MB: (4KB to be test) >>>> >>>> Nginx worker_processes 1: >>>> 4k 100k 1M >>>> Io_uring 220MB/s 1GB/s 1.3GB/s >>>> Libaio 70MB/s 250MB/s 600MB/s(with -c 200, 1.0GB/s) >>>> sendfile tbt 260MB/s 700MB/s >>>> >>>> >>>> Nginx worker_processes 4: >>>> 4k 100k 1M >>>> Io_uring 800MB/s 2.5GB/s 2.6GB/s(my nvme disk io maximum bw) >>>> libaio 250MB/s 900MB/s 2.0GB/s >>>> sendfile tbt 900MB/s 1.6GB/s >>>> >>>> Regards, >>>> Ping >>>> >>>> -----Original Message----- >>>> From: nginx-devel <nginx-devel-boun...@nginx.org> On Behalf Of >>>> Mikhail Isachenkov >>>> Sent: Thursday, February 4, 2021 4:55 PM >>>> To: nginx-devel@nginx.org >>>> Subject: Re: [PATCH] Add io_uring support in AIO(async io) module >>>> >>>> Hi Zhao Ping, >>>> >>>> My test is much simpler than yours. I created >>>> /usr/local/html/(11111...99999) files on SSD (100 kb size) and wrote small >>>> lua script for wrk that adds 5 random digits to request. There are no such >>>> errors without patch with aio enabled. >>>> These files does not change during test. >>>> >>>> I'll try to reproduce this on CentOS 8 -- which repository do you use to >>>> install 5.x kernel? >>>> >>>> Also, could you please run the test with 'sendfile on' and 'aio off' to >>>> get reference numbers for sendfile too? >>>> >>>> Thanks in advance! >>>> >>>> 04.02.2021 10:08, Zhao, Ping пишет: >>>>> Another possible cause is that "/usr/local/html/64746" was >>>>> changed/removed when other user tried to read it. >>>>> >>>>> -----Original Message----- >>>>> From: Zhao, Ping >>>>> Sent: Thursday, February 4, 2021 10:33 AM >>>>> To: nginx-devel@nginx.org >>>>> Subject: RE: [PATCH] Add io_uring support in AIO(async io) module >>>>> >>>>> Hi Mikhail, >>>>> >>>>> I didn't see this error in my log. Following is my OS/Kernel: >>>>> CentOS: 8.1.1911 >>>>> Kernel: 5.7.19 >>>>> Liburing: liburing-1.0.7-3.el8.x86_64, >>>>> liburing-devel-1.0.7-3.el8.x86_64 (from yum repo) >>>>> >>>>> Regarding the error: 11: Resource temporarily unavailable. It's probably >>>>> that too many read "/usr/local/html/64746" at one time which is still >>>>> locked by previous read. I tried to repro this error with single file but >>>>> it seems nginx auto store the signal file in memory and I don't see >>>>> error. How do you perform the test? I want to repro this if possible. >>>>> >>>>> My nginx reported this error before: >>>>> 2021/01/04 05:04:29 [alert] 50769#50769: *11498 pread() read only 7101 of >>>>> 15530 from "/mnt/cache1/17/68aae9d816ec02340ee617b7ee52a117", client: >>>>> 11.11.11.3, server: _, request: "GET >>>>> /_100kobject?version=cdn003191&thread=64 HTTP/1.1", host: >>>>> "11.11.11.1:8080" >>>>> Which is fixed by my 2nd patch(Jan 25) already. >>>>> >>>>> BR, >>>>> Ping >>>>> >>>>> -----Original Message----- >>>>> From: nginx-devel <nginx-devel-boun...@nginx.org> On Behalf Of >>>>> Mikhail Isachenkov >>>>> Sent: Wednesday, February 3, 2021 10:11 PM >>>>> To: nginx-devel@nginx.org >>>>> Subject: Re: [PATCH] Add io_uring support in AIO(async io) module >>>>> >>>>> Hi Ping Zhao, >>>>> >>>>> When I try to repeat this test, I've got a huge number of these errors: >>>>> >>>>> 2021/02/03 10:22:48 [crit] 30018#30018: *2 aio read >>>>> "/usr/local/html/64746" failed (11: Resource temporarily >>>>> unavailable) while sending response to client, client: 127.0.0.1, server: >>>>> localhost, >>>>> request: "GET /64746 HTTP/1.1", host: "localhost" >>>>> >>>>> I tested this patch on Ubuntu 20.10 (5.8.0-1010-aws kernel version) and >>>>> Fedora 33 (5.10.11-200.fc33.x86_64) with the same result. >>>>> >>>>> Did you get any errors in error log with patch applied? Which OS/kernel >>>>> did you use for testing? Did you perform any specific tuning before >>>>> running? >>>>> >>>>> 25.01.2021 11:24, Zhao, Ping пишет: >>>>>> Hello, add a small update to correct the length when part of request >>>>>> already received in previous. >>>>>> This case may happen when using io_uring and throughput increased. >>>>>> >>>>>> # HG changeset patch >>>>>> # User Ping Zhao <ping.z...@intel.com> # Date 1611566408 18000 >>>>>> # Mon Jan 25 04:20:08 2021 -0500 >>>>>> # Node ID f2c91860b7ac4b374fff4353a830cd9427e1d027 >>>>>> # Parent 1372f9ee2e829b5de5d12c05713c307e325e0369 >>>>>> Correct length calculation when part of request received. >>>>>> >>>>>> diff -r 1372f9ee2e82 -r f2c91860b7ac src/core/ngx_output_chain.c >>>>>> --- a/src/core/ngx_output_chain.c Wed Jan 13 11:10:05 2021 -0500 >>>>>> +++ b/src/core/ngx_output_chain.c Mon Jan 25 04:20:08 2021 -0500 >>>>>> @@ -531,6 +531,14 @@ >>>>>> >>>>>> size = ngx_buf_size(src); >>>>>> size = ngx_min(size, dst->end - dst->pos); >>>>>> +#if (NGX_HAVE_FILE_IOURING) >>>>>> + /* >>>>>> + * check if already received part of the request in previous, >>>>>> + * calculate the remain length >>>>>> + */ >>>>>> + if(dst->last > dst->pos && size > (dst->last - dst->pos)) >>>>>> + size = size - (dst->last - dst->pos); #endif >>>>>> >>>>>> sendfile = ctx->sendfile && !ctx->directio; >>>>>> >>>>>> -----Original Message----- >>>>>> From: nginx-devel <nginx-devel-boun...@nginx.org> On Behalf Of >>>>>> Zhao, Ping >>>>>> Sent: Thursday, January 21, 2021 9:44 AM >>>>>> To: nginx-devel@nginx.org >>>>>> Subject: RE: [PATCH] Add io_uring support in AIO(async io) module >>>>>> >>>>>> Hi Vladimir, >>>>>> >>>>>> No special/extra configuration needed, but need check if 'aio on' and >>>>>> 'sendfile off' is correctly set. This is my Nginx config for reference: >>>>>> >>>>>> user nobody; >>>>>> daemon off; >>>>>> worker_processes 1; >>>>>> error_log error.log ; >>>>>> events { >>>>>> worker_connections 65535; >>>>>> use epoll; >>>>>> } >>>>>> >>>>>> http { >>>>>> include mime.types; >>>>>> default_type application/octet-stream; >>>>>> access_log on; >>>>>> aio on; >>>>>> sendfile off; >>>>>> directio 2k; >>>>>> >>>>>> # Cache Configurations >>>>>> proxy_cache_path /mnt/cache0 levels=2 >>>>>> keys_zone=nginx-cache0:400m max_size=1400g inactive=4d >>>>>> use_temp_path=off; ...... >>>>>> >>>>>> >>>>>> To better measure the disk io performance data, I do the following steps: >>>>>> 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) >>>>>> echo 2G > memory.limit_in_bytes >>>>>> use ' cgexec -g memory:nginx' to start Nginx. >>>>>> >>>>>> 2. use wrk -t 100 -c 1000, with random 25000 http requests. >>>>>> 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. >>>>>> >>>>>> 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. >>>>>> >>>>>> 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) >>>>>> >>>>>> Following is the test result: >>>>>> >>>>>> Nginx worker_processes 1: >>>>>> 4k 100k 1M >>>>>> Io_uring 220MB/s 1GB/s 1.3GB/s >>>>>> Libaio 70MB/s 250MB/s 600MB/s(with -c 200, 1.0GB/s) >>>>>> >>>>>> >>>>>> Nginx worker_processes 4: >>>>>> 4k 100k 1M >>>>>> Io_uring 800MB/s 2.5GB/s 2.6GB/s(my nvme disk io maximum bw) >>>>>> libaio 250MB/s 900MB/s 2.0GB/s >>>>>> >>>>>> 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. >>>>>> >>>>>> Regards, >>>>>> Ping >>>>>> >>>>>> -----Original Message----- >>>>>> From: nginx-devel <nginx-devel-boun...@nginx.org> On Behalf Of >>>>>> Vladimir Homutov >>>>>> Sent: Wednesday, January 20, 2021 12:43 AM >>>>>> To: nginx-devel@nginx.org >>>>>> Subject: Re: [PATCH] Add io_uring support in AIO(async io) module >>>>>> >>>>>> On Tue, Jan 19, 2021 at 03:32:30AM +0000, Zhao, Ping wrote: >>>>>>> It depends on if disk io is the performance hot spot or not. If >>>>>>> yes, io_uring shows improvement than libaio. With 4KB/100KB >>>>>>> length >>>>>>> 1 Nginx thread it's hard to see performance difference because >>>>>>> iostat is only around ~10MB/100MB per second. Disk io is not the >>>>>>> performance bottle neck, both libaio and io_uring have the same >>>>>>> performance. If you increase request size or Nginx threads >>>>>>> number, for example 1MB length or Nginx thread number 4. In this >>>>>>> case, disk io became the performance bottle neck, you will see io_uring >>>>>>> performance improvement. >>>>>> >>>>>> Can you please provide full test results with specific nginx >>>>>> configuration? >>>>>> >>>>>> _______________________________________________ >>>>>> nginx-devel mailing list >>>>>> nginx-devel@nginx.org >>>>>> http://mailman.nginx.org/mailman/listinfo/nginx-devel >>>>>> _______________________________________________ >>>>>> nginx-devel mailing list >>>>>> nginx-devel@nginx.org >>>>>> http://mailman.nginx.org/mailman/listinfo/nginx-devel >>>>>> _______________________________________________ >>>>>> nginx-devel mailing list >>>>>> nginx-devel@nginx.org >>>>>> http://mailman.nginx.org/mailman/listinfo/nginx-devel >>>>>> >>>>> >>>>> -- >>>>> Best regards, >>>>> Mikhail Isachenkov >>>>> NGINX Professional Services >>>>> _______________________________________________ >>>>> nginx-devel mailing list >>>>> nginx-devel@nginx.org >>>>> http://mailman.nginx.org/mailman/listinfo/nginx-devel >>>>> _______________________________________________ >>>>> nginx-devel mailing list >>>>> nginx-devel@nginx.org >>>>> http://mailman.nginx.org/mailman/listinfo/nginx-devel >>>>> >>>> >>>> -- >>>> Best regards, >>>> Mikhail Isachenkov >>>> NGINX Professional Services >>>> _______________________________________________ >>>> nginx-devel mailing list >>>> nginx-devel@nginx.org >>>> http://mailman.nginx.org/mailman/listinfo/nginx-devel >>>> _______________________________________________ >>>> nginx-devel mailing list >>>> nginx-devel@nginx.org >>>> http://mailman.nginx.org/mailman/listinfo/nginx-devel >>>> >>> >>> -- >>> Best regards, >>> Mikhail Isachenkov >>> NGINX Professional Services >>> _______________________________________________ >>> nginx-devel mailing list >>> nginx-devel@nginx.org >>> http://mailman.nginx.org/mailman/listinfo/nginx-devel >>> _______________________________________________ >>> nginx-devel mailing list >>> nginx-devel@nginx.org >>> http://mailman.nginx.org/mailman/listinfo/nginx-devel >>> >> >> -- >> Best regards, >> Mikhail Isachenkov >> NGINX Professional Services >> _______________________________________________ >> nginx-devel mailing list >> nginx-devel@nginx.org >> http://mailman.nginx.org/mailman/listinfo/nginx-devel >> > > -- > Best regards, > Mikhail Isachenkov > NGINX Professional Services > _______________________________________________ > nginx-devel mailing list > nginx-devel@nginx.org > http://mailman.nginx.org/mailman/listinfo/nginx-devel > _______________________________________________ > nginx-devel mailing list > nginx-devel@nginx.org > http://mailman.nginx.org/mailman/listinfo/nginx-devel > -- Best regards, Mikhail Isachenkov NGINX Professional Services _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel