powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / CentOS.x64: трассировка файловых операций
9 сообщений из 9, страница 1 из 1
CentOS.x64: трассировка файловых операций
    #37885337
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, уважаемые сисадмины и разработчики!


Нужно определить характер нагрузки на несколько крупных файлов (по 32Gb).

Статистики которую выдаёт iostat и sar - недостаточно.

Можно-ли как-то в отладочном режиме или еще как-либо понаблюдать
какие файловые операции и с какими аргументами выполняются над
некоторым множеством файлов. (Для простоты - все они лежат в 1 директории).

Нужно получить лог наподобие этого

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
begin
process 33, fopen('/data/d1.dmp',...) as handle 3553
process 34, fopen('/data/d2.dmp',...) as handle 3554
...
process 33, fseek (3553,34562894)
process 34, fseek (3554,394)
process 33, fread (3553,0,2048)
process 34, fread (3553,0,2048)
....
fclose...
fclose...
end


Или что-то в этом роде.

Потом по этому списку нужно построить график операций fseek в зависимости от времени.

Спасибо.
...
Рейтинг: 0 / 0
CentOS.x64: трассировка файловых операций
    #37885845
maytonНужно определить характер нагрузки на несколько крупных файлов (по 32Gb).
Скачать видео смотреть онлайн сервис?


maytonСпасибо.

изучай systemtap, strace
...
Рейтинг: 0 / 0
CentOS.x64: трассировка файловых операций
    #37885853
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> изучай systemtap, strace

Спасибо. Почитаю.
...
Рейтинг: 0 / 0
CentOS.x64: трассировка файловых операций
    #37892132
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу потрассировать аргументы fseek(lseek внутри).

Код: plaintext
1.
2.
3.
#!/bin/bash

strace -x -e trace=open,close,lseek,read,write,access -o strace.log -s 512 ./test



В бинарнике test существуют вызовы fseek(f,offset,SEEK_SET) где offset меняется
по случайному закону (rand()).

В трейс-файле получаем константы.

Код: plaintext
1.
2.
3.
4.
5.
6.
...
lseek(4, 4096, SEEK_SET)                = 4096
lseek(4, 4096, SEEK_SET)                = 4096
lseek(4, 4096, SEEK_SET)                = 4096
lseek(4, 4096, SEEK_SET)                = 4096
close(4)                                = 0
...
Рейтинг: 0 / 0
CentOS.x64: трассировка файловых операций
    #37892537
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот тест
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define BLOCK_SIZE 1024
#define BLOCKS 500
#define TEST_CYCLES 100

typedef unsigned char byte;

void info(char *message){
    time_t seconds;
    seconds=time(NULL);
    tm *t=localtime(&seconds);
    printf("%04d-%02d-%02d %02d:%02d:%02d [INFO] %s\n",
    t->tm_year+1900,t->tm_mon+1,t->tm_mday,
    t->tm_hour,t->tm_min,t->tm_sec,
    message);
}

int main(int argc,char *argv[]){
    time_t seconds;
    info("Begin..");
    FILE* f=fopen("test","w");
    byte *pbuf=(byte*)malloc(BLOCK_SIZE);

    for(int i=0;i<BLOCK_SIZE;i++) pbuf[i]=0xFF&rand();

    info("Checkpotint #1\n");

    for(int i=0;i<BLOCKS;i++){
        fwrite(pbuf,BLOCK_SIZE,1,f);
    }
    fclose(f);
    info("Checkpotint #2\n");
    f=fopen("test","r");
    for(int i=0;i<TEST_CYCLES;i++){
        int offset=rand()%BLOCKS;
        fseek(f,offset,SEEK_SET);
        fread(pbuf,BLOCK_SIZE,1,f);
    }
    fclose(f);

    free(pbuf);
    info("End");
    return 0;
}

...
Рейтинг: 0 / 0
CentOS.x64: трассировка файловых операций
    #37892565
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можешь поглядеть на OProfile в этом смысле.
http://oprofile.sourceforge.net/news/

Он и ядро умеет профилировать.
...
Рейтинг: 0 / 0
CentOS.x64: трассировка файловых операций
    #37892611
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, fseek и lseek это разные функции, fseek это C и работает через буфер C RTL, lseek напрямую.

#define BLOCKS 500

int offset=rand()%BLOCKS;

все смещения будут меньше 500 - попадут в буфер, все остальные fseek можно не делать, данные уже в буфере. Он их и не делает, а
lseek(4, 4096, SEEK_SET) = 4096
lseek(4, 4096, SEEK_SET) = 4096
lseek(4, 4096, SEEK_SET) = 4096
lseek(4, 4096, SEEK_SET) = 4096

это возможно проверка что данные из буфера всё ещё доступны в файле
...
Рейтинг: 0 / 0
CentOS.x64: трассировка файловых операций
    #37892870
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мастер, Ёж. Спасибо. Пойду читать. Возможно я поторопился насчёт stdio.h
и коммерческий софт который я буду трассировать его не использует тогда задача
упрощается.
...
Рейтинг: 0 / 0
CentOS.x64: трассировка файловых операций
    #37894639
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include <string.h>

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

#include <errno.h>

#define BLOCK_SIZE 1024
#define BLOCKS 10
#define TEST_CYCLES 10

typedef unsigned char byte;

void info(char *message){
    time_t seconds;
    seconds=time(NULL);
    tm *t=localtime(&seconds);
    printf("%04d-%02d-%02d %02d:%02d:%02d [INFO] %s\n",
    t->tm_year+1900,t->tm_mon+1,t->tm_mday,
    t->tm_hour,t->tm_min,t->tm_sec,
    message);
}

int main(int argc,char *argv[]){
    char* errBuf=new char[256];
    time_t seconds;
    info("Begin..");
    //FILE* f=fopen("test","w");
    int h=open("test",O_RDWR|O_CREAT);
    if (h<0) {
        int err=errno;
        printf("Errno = %i\n",err);
        return -1;
    }
    byte *pbuf=(byte*)malloc(BLOCK_SIZE);

    for(int i=0;i<BLOCK_SIZE;i++) pbuf[i]=0xFF&rand();

    info("Checkpotint #1\n");

    for(int i=0;i<BLOCKS;i++){
        //fwrite(pbuf,BLOCK_SIZE,1,f);
        write(h,pbuf,BLOCK_SIZE);
    }
    close(h);
    //fclose(f);
    info("Checkpotint #2\n");
    //f=fopen("test","r");
    h=open("test",O_WRONLY);
    if (h<0) {
        int err=errno;
        printf("Errno(1) = %i\n",err);
        exit(-1);
    }
    for(int i=0;i<TEST_CYCLES;i++){
        int offset=rand()%BLOCKS;
        //fseek(f,offset,SEEK_SET);
        int seekres=lseek(h,offset,SEEK_SET);
        if (seekres==-1){
            int err=errno;
            printf("Errno(2) = %i strerror = %s\n",err,strerror(err));
            exit(-1);    
        }
        //fread(pbuf,BLOCK_SIZE,1,f);
        int res=0;
        res=read(h,pbuf,BLOCK_SIZE);        
        if (res<0){
            int err=errno;
            printf("Errno(3) = %i strerror = %s\n",err,strerror(err));
            exit(-1);    
        }
    }
    //fclose(f);
    close(h);
    free(pbuf);
    info("End");
    return 0;
    delete[] errBuf;
}
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / CentOS.x64: трассировка файловых операций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]