为什么linux命令(iostat)中的每秒读取数(r / s)始终为零?
发布时间:2020-12-13 23:03:46  所属栏目:Linux  来源:网络整理 
            导读:我运行一个 java代码,它会从文本文件中生成大量的读写内容.程序源非常简单,在循环中我在测试文件中写入2000行,然后我再次读取它们只是为了生成大量的磁盘读写.但是当程序运行时,我通过“iostat -d -x 1”监视磁盘我发现第二个“r / s”中的读取没有变化但是
                
                
                
            | 
                         
 我运行一个 
 java代码,它会从文本文件中生成大量的读写内容.程序源非常简单,在循环中我在测试文件中写入2000行,然后我再次读取它们只是为了生成大量的磁盘读写.但是当程序运行时,我通过“iostat -d -x 1”监视磁盘我发现第二个“r / s”中的读取没有变化但是“w / s”增加了我的预期! 
  
这是iostat命令的示例输出: Device: rrqm/s wrqm/s r/s w/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/s r/s w/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/s r/s w/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/s r/s w/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”没有变化!! 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仅报告实际的磁盘读写,因此您的缓存读取不会显示在那里.
 
        (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
