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


Нужно определить характер нагрузки на несколько крупных файлов (по 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
19.07.2012, 17:07
    #37885845
CentOS.x64: трассировка файловых операций
maytonНужно определить характер нагрузки на несколько крупных файлов (по 32Gb).
Скачать видео смотреть онлайн сервис?


maytonСпасибо.

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

Спасибо. Почитаю.
...
Рейтинг: 0 / 0
25.07.2012, 13:45
    #37892132
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CentOS.x64: трассировка файловых операций
Не могу потрассировать аргументы 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
25.07.2012, 16:36
    #37892537
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CentOS.x64: трассировка файловых операций
А вот тест
Код: 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
25.07.2012, 16:52
    #37892565
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CentOS.x64: трассировка файловых операций
Можешь поглядеть на OProfile в этом смысле.
http://oprofile.sourceforge.net/news/

Он и ядро умеет профилировать.
...
Рейтинг: 0 / 0
25.07.2012, 17:10
    #37892611
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CentOS.x64: трассировка файловых операций
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
25.07.2012, 19:29
    #37892870
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CentOS.x64: трассировка файловых операций
Мастер, Ёж. Спасибо. Пойду читать. Возможно я поторопился насчёт stdio.h
и коммерческий софт который я буду трассировать его не использует тогда задача
упрощается.
...
Рейтинг: 0 / 0
27.07.2012, 02:16
    #37894639
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CentOS.x64: трассировка файловых операций
Код: 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
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / CentOS.x64: трассировка файловых операций / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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