Сообщение Итог: Для O_DIRECT надо выравнивать адрес буфера тоже от 15.05.2019 18:37
Изменено 15.05.2019 19:27 VladCore
Re: Как этот O_DIRECT передать? :???:
Здравствуйте, VladCore, Вы писали:
VC>В Windows кто не в курсе отключить кеширование и чтения и записи можно в конструкторе FileStream секретной опцией:
VC>в линуксе нужно передавать O_DIRECT
VC># define O_DIRECT 040000
Черт. В линуксе кеш на чтение не выключается вот атким методом:
Это .net core 2.2 если что
Я могу конечно в mono проверить, но мне надо в Core.
Что то пошло не так?
VC>В Windows кто не в курсе отключить кеширование и чтения и записи можно в конструкторе FileStream секретной опцией:
VC>в линуксе нужно передавать O_DIRECT
VC># define O_DIRECT 040000
Черт. В линуксе кеш на чтение не выключается вот атким методом:
const int O_DIRECT = 0x4000;
using (var stream = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read, buffer.Length,
(FileOptions) O_DIRECT | FileOptions.WriteThrough))
{
....
}
Это .net core 2.2 если что
Я могу конечно в mono проверить, но мне надо в Core.
Что то пошло не так?
Re: Как этот O_DIRECT передать? :???:
Здравствуйте, VladCore, Вы писали:
VC>В Windows кто не в курсе отключить кеширование и чтения и записи можно в конструкторе FileStream секретной опцией:
VC>в линуксе нужно передавать O_DIRECT
VC># define O_DIRECT 040000
Черт. В линуксе кеш на чтение не выключается вот атким методом:
Это .net core 2.2 если что
Я могу конечно в mono проверить, но мне надо в Core.
Что то пошло не так?
Update: Отвечаю сам себе. В core все подряд нельзя передавать в FileOptions. Приехали:
Надо как то самому получить SafeFileHandle и передать его в констутор
VC>В Windows кто не в курсе отключить кеширование и чтения и записи можно в конструкторе FileStream секретной опцией:
VC>в линуксе нужно передавать O_DIRECT
VC># define O_DIRECT 040000
Черт. В линуксе кеш на чтение не выключается вот атким методом:
const int O_DIRECT = 0x4000;
using (var stream = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read, buffer.Length,
(FileOptions) O_DIRECT | FileOptions.WriteThrough))
{
....
}
Это .net core 2.2 если что
Я могу конечно в mono проверить, но мне надо в Core.
Что то пошло не так?
Update: Отвечаю сам себе. В core все подряд нельзя передавать в FileOptions. Приехали:
private static Interop.Sys.OpenFlags PreOpenConfigurationFromOptions(
FileMode mode,
FileAccess access,
FileShare share,
FileOptions options)
{
Interop.Sys.OpenFlags openFlags = Interop.Sys.OpenFlags.O_RDONLY;
switch (mode)
{
case FileMode.CreateNew:
openFlags |= Interop.Sys.OpenFlags.O_CREAT | Interop.Sys.OpenFlags.O_EXCL;
break;
case FileMode.Create:
case FileMode.OpenOrCreate:
case FileMode.Append:
openFlags |= Interop.Sys.OpenFlags.O_CREAT;
break;
}
switch (access)
{
case FileAccess.Read:
openFlags |= Interop.Sys.OpenFlags.O_RDONLY;
break;
case FileAccess.Write:
openFlags |= Interop.Sys.OpenFlags.O_WRONLY;
break;
case FileAccess.ReadWrite:
openFlags |= Interop.Sys.OpenFlags.O_RDWR;
break;
}
if ((share & FileShare.Inheritable) == FileShare.None)
openFlags |= Interop.Sys.OpenFlags.O_CLOEXEC;
// Вот тут только FileOptions читается и всё
if ((options & FileOptions.WriteThrough) != FileOptions.None)
openFlags |= Interop.Sys.OpenFlags.O_SYNC;
return openFlags;
}
Надо как то самому получить SafeFileHandle и передать его в констутор
public FileStream(SafeFileHandle handle, FileAccess access, int bufferSize, bool isAsync);