From: Masaki Matsushita Date: 2012-02-21T13:47:15+09:00 Subject: [ruby-core:42772] [ruby-trunk - Feature #5995] calling io_advise_internal() in read_all() Issue #5995 has been updated by Masaki Matsushita. Some file systems(e.g. ext3, ext4) use do_sync_read() for general read. http://lxr.linux.no/#linux+v3.2.6/fs/ext3/file.c#L55 http://lxr.linux.no/#linux+v3.2.6/fs/ext4/file.c#L231 In read process, do_generic_file_read() is called finally. http://lxr.linux.no/#linux+v3.2.6/fs/read_write.c#L338 ( do_sync_read() ) In ext3 and ext4, f_op->aio_read is generic_file_aio_read(). http://lxr.linux.no/#linux+v3.2.6/mm/filemap.c#L1395 ( It calls do_generic_file_read(). ) Then, do_generic_file_read() calls page_cache_sync_readahead() or page_cache_async_readahead(). http://lxr.linux.no/#linux+v3.2.6/mm/filemap.c#L1118 Both page_cache_sync_readahead() and page_cache_async_readahead() call ondemand_readahead() and its readahead size is limited by ra->ra_pages. http://lxr.linux.no/#linux+v3.2.6/mm/readahead.c#L401 posix_fadvise() expands ra->ra_pages( http://lxr.linux.no/#linux+v3.2.6/mm/fadvise.c#L90 ) and it reduces the number of times of actual read. Therefore, I think the patch makes sense on some file systems as stated above. ---------------------------------------- Feature #5995: calling io_advise_internal() in read_all() https://bugs.ruby-lang.org/issues/5995 Author: Masaki Matsushita Status: Rejected Priority: Normal Assignee: Motohiro KOSAKI Category: core Target version: =begin I propose to call io_advise_internal() in read_all(). It will increase performance. I created a dummy file: dd if=/dev/zero of=dummy bs=1M count=100 Then, I ran the following: require 'benchmark' Benchmark.bm do |x| x.report do f = File.open("dummy") # dummy file(about 100MB ) f.read end end I freed page cache before each test: sudo sysctl -w vm.drop_caches=1 results on Ubuntu 11.10(3.0.0-15-server): r34462: user system total real 0.050000 0.220000 0.270000 ( 0.356033) user system total real 0.050000 0.190000 0.240000 ( 0.332243) user system total real 0.060000 0.210000 0.270000 ( 0.347758) patched ruby: user system total real 0.030000 0.130000 0.160000 ( 0.225866) user system total real 0.040000 0.170000 0.210000 ( 0.250172) user system total real 0.040000 0.150000 0.190000 ( 0.254654) It shows the patch increases performance. =end -- http://bugs.ruby-lang.org/