WriteFile () с WRITE_THROUGH медленно на системном диске - PullRequest
0 голосов
/ 15 июля 2010

В Windows Server 2008 R2 следующая очень простая программа ведет себя по-разному на системном диске и на любом другом диске.Кажется, что на системном диске FILE_FLAG_WRITE_THROUGH что-то делает ...

На диске C: (системный диск, стандартный SATA, без RAID)

$ time ./test.exe

real    1m8.281s
user    0m0.000s
sys     0m0.015s

На диске E: (другой физический диск SATA)

$ time ./test.exe

real    0m5.445s
user    0m0.000s
sys     0m0.000s

-

#include <stdio.h>
#include <windows.h>

#define BUFFER_SIZE   1024
#define ITERATIONS    10240
#define FILEFLAGS     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH

BYTE   buff[BUFFER_SIZE];

BOOL SyncWriteFile(HANDLE fd,
                   LPCVOID buf,
                   DWORD to_write) {
    DWORD written = 0, already_written = 0;
 BOOL res = FALSE;

 while(written < to_write) {
  res = WriteFile(fd,
   (BYTE*)buf + written,
   to_write - written,
   &already_written,
   NULL);

  if (FALSE == res)
   return FALSE;
  else
   written += already_written;
 }
    return TRUE;
}

void main() 
{
 HANDLE hFile;
 int i;

 hFile = CreateFile(TEXT("test"),
     GENERIC_READ | GENERIC_WRITE,
     0,
     NULL,
     CREATE_NEW,
     FILEFLAGS,
     NULL);

 if (hFile == INVALID_HANDLE_VALUE) {
    fprintf(stderr, "Could not create test file."); 
    exit(1);
 }

 for(i=0; i<ITERATIONS; i++) {
  SyncWriteFile(hFile, buff, sizeof(buff));
 }

 CloseHandle(hFile);
}
  1. Что происходит?
  2. Может кто-нибудь попытаться воспроизвести это на Win Server?

1 Ответ

0 голосов
/ 24 июля 2010

Странное поведение диска Samsung SATA 500 ГБ (умирает?) С прошивкой SD15. Мы исправили это с помощью утилиты dd и нового диска. Теперь все работает нормально. Извините за «ложную тревогу».

...