Hi Mikhail, Sorry for late. I'm on Chinese New Year holiday leave. I can't see any problem from your steps, but the result is different from mine. It's strange, I'll try when I'm back to office next week. Would you check the io_uring nginx with ldd to see if it's linked with liburing first?
# ldd /path/to/nginx linux-vdso.so.1 (0x00007ffce4ff8000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f72aa689000) liburing.so.1 => /lib64/liburing.so.1 (0x00007f72aa485000) .... Or you can enable the debug log option in config to see if any 'io_uring_peek_cqe' in the log: [debug] 53391#53391: io_uring_peek_cqe: START BR, 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