Hatena::Groupfilesystem

fs_n314

 | 

2008-06-03

bonnie++のSequential Readでは何が行われているか

02:29 | bonnie++のSequential Readでは何が行われているか - fs_n314 を含むブックマーク はてなブックマーク - bonnie++のSequential Readでは何が行われているか - fs_n314

Sequential CreateやSequential Readと言われると何となく分かった気になるけれど、実際に中でどう動いているのかを見る。


ここでのreadというのは実はstatである。

int COpenTest::stat_sequential(BonTimer &timer)
{
  timer.timestamp();
  int count = 0;
  for(int i = 0; i < m_number_directories; i++)
  {
    char buf[6];
    if(m_number_directories != 1)
    {
      sprintf(buf, "%05d", i);
    }

    DIR *d = opendir(".");

    dirent *file_ent;
    while((file_ent = readdir(d)) != NULL)
    {
      if(file_ent->d_name[0] != '.') // our files do not start with a dot
      {
        if(-1 == stat_file(file_ent->d_name))
        {
          if(m_number_directories != 1)
            chdir("..");
          return -1;
        }
        count++;
      }
    }
    closedir(d);

  }

  timer.get_delta_t(StatSeq);
  return 0;

#ifdef OS2 の部分とエラーなどにより途中でreturnする部分は削った。


m_number_directoriesというのは -n オプションで指定したnum-directoriesであり、デフォルトは1である。

ディレクトリファイルがある限りstat_fileを繰り返している。


int COpenTest::stat_file(CPCCHAR file)
{
  struct stat st;
  if(stat(file, &st))
  {
    fprintf(stderr, "Can't stat file %s\n", file);
    return -1;
  }
  if(st.st_size)
  {
    FILE_TYPE fd = 0;
    fd = open(file, O_RDONLY);
    if(fd == -1)

    for(int i = 0; i < st.st_size; i += m_chunk_size)
    {
      int to_read = st.st_size - i;
      if(to_read > m_chunk_size) to_read = m_chunk_size;
      if(to_read != read(fd, static_cast<void *>(m_buf), to_read))
      {
        fprintf(stderr, "Can't read data.\n");
        return -1;
      }
    }
    file_close(fd);
  }
  return 0;
}

ここでstatシステムコールとreadシステムコールが呼び出されている。



ファイルがある限り繰り返すと書いたが、これはreadが呼ばれる前のcreateで作られる。

これはdirectory_size * DirectoryUnitであり、デフォルトは 16 * 1024 = 16384 になっている。

トラックバック - http://filesystem.g.hatena.ne.jp/n314/20080603
 | 
日記の検索