为什么每秒读取(r / s)在linux命令(iostat)中一直为零?

我运行一个java代码,产生大量的读写文本文件。 程序源代码非常简单,在一个循环中,我在一个testing文件中写入了2000行,然后再次读取它们,只是为了产生大量的读写操作。 但是当程序运行时,我通过“iostat -d -x 1” 监视磁盘 ,发现第二个“r / s”中的读取没有变化,但是“w / s”增加了。 这是iostat命令的输出示例:

Device: rrqm/s wrqm/sr/sw/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 913.00 0.00 82.00 0.00 7872.00 96.00 0.58 7.09 7.11 58.30 Device: rrqm/s wrqm/sr/sw/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 869.00 0.00 79.00 0.00 7584.00 96.00 0.57 7.11 7.18 56.70 Device: rrqm/s wrqm/sr/sw/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 847.00 0.00 77.00 0.00 7392.00 96.00 0.57 7.42 7.43 57.20 Device: rrqm/s wrqm/sr/sw/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 1221.00 0.00 113.00 0.00 10760.00 95.22 0.84 7.47 7.32 82.70 

如所示,所有的“r / s”都是零! 但在Java程序中,我读取的文件与我在文件中写入的一样多! 当我运行Java代码时,每秒写入次数增加,但“r / s”没有变化! 这里是监控磁盘时运行的java代码:

 import java.io.*; public class Test { public static void main(String [] args) throws IOException{ String fileName = "/scratch/dump_file.txt"; File f = new File(fileName); // Attempt to delete it boolean success = f.delete(); int j=0; while(j<20000) { ++j; Writer output = null; String text = "A test content"; File file = new File(fileName); output = new BufferedWriter(new FileWriter(file)); int i=1; while(i<2000) { //Here we start writing 2000 lines into file line by line output.write("j==="+Integer.toString(j)+text+Integer.toString(i)+"\n"); ++i; } output.close(); System.out.println("Your file has been written"); String line = null; try { // FileReader reads text files in the default encoding. FileReader fileReader = new FileReader(fileName); BufferedReader bufferedReader = new BufferedReader(fileReader); i=1; while((line = bufferedReader.readLine()) != null) { //Here we start reading from file line by line and show the result on screen ++i; System.out.println(line); } // Always close file bufferedReader.close(); } catch(FileNotFoundException ex) { System.out.println( "Unable to open file '" + fileName + "'"); } catch(IOException ex) { System.out.println( "Error reading file '" + fileName + "'"); // Or we could just do this: // ex.printStackTrace(); } } } } 

操作系统很可能将文件缓存在RAM中。 由于它已经被缓存在内存中,所以当你用Java读取时,操作系统不需要从磁盘上实际读取 – 它只是给你已经存在的缓存拷贝。 这比从磁盘上读取要快得多。 但是,请注意,由于iostat只报告实际的磁盘读取和写入,您的缓存读取将不会显示在那里。