RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : Или кэш не кэширует или я ....


Список сообщений | Написать новое | Ответить на сообщение | Домой Поиск:
Предыдущее сообщение | Следующее сообщение
From : saa
To : All
Subj : Или кэш не кэширует или я ....

Давно уже у меня зуб на HPFS кэш от Мерлина, по крайней мере русского, и по крайней мере от фиксов 0, 2 и 5. Всегда добивало его категорическая привиредливость при кэшировании на запись. Но когда вчера винчестер тарахтел без умолку, когда я постоянно перечитывал 16-Кб кусок файла, я понял, что тут что-то не так.

Привожу два примера. Первый - странное кэширование при записи (это не самое странное, что я видел, но всё же). После запуска поначалу всё идет так, как и ожидалось. Но уже через 0-20 секунд (зависит от предыстории) система "зажигает LED HDD и не гасит ее" (надеюсь, я не слишком вульгарно выражаюсь).

--- begin write.cpp ---
#include "stdio.h"
#include "assert.h"
#include "stdlib.h"
#define INCL_DOS
#include "os2.h"
int main ()
{
int sz=65536;
char *buf = new char[sz]; assert(buf!=0);
int i;
for (i=0; sz>i; i++) buf[i]=0;
FILE *f;
f = fopen ("tmp.tmp", "wb"); assert (f!=0);
for (;;)
{
//DosSleep(100);
assert (1==fwrite(buf,sz,1,f));
fseek(f,0,0);
}
fclose (f);
}
--- end ---


Второй пример меня уже добил - эпизодическое, но настойчивое нехотение кэшировать при чтении.

--- begin rw.cpp ---
#include "stdio.h"
#include "assert.h"
#include "stdlib.h"

int main(int ac, char **av)
{
int sz=65536;
int wcnt=ac>=2 ? atoi(av[1]) : 0;
char *buf = new char[sz]; assert(buf!=0);
int i;
for (i=0; sz>i; i++) buf[i]=0;
FILE *f;
if (wcnt)
{
f = fopen ("tmp.tmp", "wb"); assert (f!=0);
printf ("Writing...\n");
for (i=0; wcnt>i; i++) assert (1==fwrite(buf,sz,1,f));
fclose (f);
}
f = fopen ("tmp.tmp", "rb"); assert (f!=0);
printf ("Reading...\n");
for (;;)
{
assert (1==fread(buf,sz,1,f));
fseek(f,0,0);
}
}
--- end ---

При запуске

F:\> rw.exe 500

(с параметром 1..300 глюка нет, но с 500 или 1000 он есть. почему - не знаю.)

Вначале, как и положено, он записывает большой файл.
Затем, когда загорится "reading", и кэш записи уже сбросит все данные, загрузка процессора падает почти до нуля, зато винчестер продолжает непрерывно работать.

После этого можно нажать ctrl+break и запускать просто
F:\> rw.exe
(все дело в надлежащей предыстории) - записи происходить уже не будет, но система будет постоянно обращаться в HDD, перечитывая один и тот же 16-Кб блок. (есть тихое подозрение, что она вовсе даже не его перечитывает)

Система:

Merlin Rus FP5,

Диск F: 4Gb, HPFS

DiskIdle: 4000 миллисекунд
MaxAge: 10000 миллисекунд
BufferIdle: 2000 миллисекунд
Размер кэш-буфера: 1024 килобайт
Установлено 1 исполнителей ленивой записи.
Опережающее чтение выключено или Установлено 1 исполнителей опережающего чтения - роли не играет.

Компилятор Watcom C++10.0, (wcl386)

Что самое обидне, что _на_FATе_получается_всё_как_у_людей_. Замему дополнительно, что на FAT тестовая компиляция проекта из 30 небольших файлов в BC 3.1 идет процентов на 10-20 быстрее. %) Вот те и High Perfomance.

Неужели надо ставить HPFS386? Или просто руки кривы?

А, да, чуть не забыл:
--- CONFIG.SYS ---
IFS=F:\OS2\HPFS.IFS /CACHE:1024 /CRECL:4 /AUTOCHECK:FG
DISKCACHE=512,LW (говорят, не влияет, но всё же)
--- startup.cmd ---
F:\OS2\CACHE.EXE -DISKIDLE:4000 -MAXAGE:10000 -BUFFERIDLE:2000


Mon 03 Dec 2001 18:39 Mozilla/2.02 (X11; I)




Programmed by Dmitri Maximovich, Dmitry I. Platonoff, Eugen Kuleshov.
25.09.99 (c) 1999, RU/2. All rights reserved.
Rewritten by Dmitry Ban. All rights ignored.