From 0041b4d7c8851d63b3b8fc9eccc5f12fa64281ea Mon Sep 17 00:00:00 2001 From: wdd00 <572718113@qq.com> Date: Sun, 22 Jan 2017 07:54:03 +0800 Subject: [PATCH] add strategy zone --- src/global.c | 1 + src/main.c | 5 +- src/ssd-cache.c | 172 +++++++++++++++++++---------------------- src/ssd-cache.h | 6 +- src/strategy/maxcold.h | 2 +- src/trace2call.c | 12 ++- 6 files changed, 99 insertions(+), 99 deletions(-) diff --git a/src/global.c b/src/global.c index 119db15..81fec0b 100644 --- a/src/global.c +++ b/src/global.c @@ -36,6 +36,7 @@ unsigned long flush_bands; unsigned long flush_band_size; unsigned long flush_fifo_blocks; unsigned long flush_ssd_blocks; +unsigned long flush_ssd_zones; //unsigned long write-fifo-num; //unsigned long write-ssd-num; unsigned long flush_fifo_times; diff --git a/src/main.c b/src/main.c index a35dd93..f776fef 100644 --- a/src/main.c +++ b/src/main.c @@ -27,8 +27,9 @@ main(int argc, char **argv) "../trace/stg_0.csv.req", "../trace/ts_0.csv.req", "../trace/usr_0.csv.req", - "../trace/wdev_0.csv.req", - "../trace/web_0.csv.req"}; + "/home/trace/MS-Cambridge/wdev_0.csv.req", + "../trace/web_0.csv.req", + "/home/test.txt"}; if (argc == 8) { NSSDBuffers = atoi(argv[1]); diff --git a/src/ssd-cache.c b/src/ssd-cache.c index b4dbced..8d1d415 100644 --- a/src/ssd-cache.c +++ b/src/ssd-cache.c @@ -48,7 +48,8 @@ initSSDBuffer() read_ssd_blocks = 0; time_read_ssd = 0.0; time_write_ssd = 0.0; - read_hit_num; + read_hit_num = 0; + flush_ssd_zones = 0; } void * @@ -63,7 +64,7 @@ flushSSDBuffer(SSDBufferDesc * ssd_buf_hdr) SSD_BUFFER_SIZE = BNDSZ; BLCKSZ = BNDSZ; } - returnCode = posix_memalign(&ssd_buffer, 512, sizeof(char) * BLCKSZ); + returnCode = posix_memalign(&ssd_buffer,512,sizeof(char)*SSD_BUFFER_SIZE); if (returnCode < 0) { printf("[ERROR] flushSSDBuffer():--------posix memalign\n"); free(ssd_buffer); @@ -71,6 +72,7 @@ flushSSDBuffer(SSDBufferDesc * ssd_buf_hdr) } gettimeofday(&tv_begin_temp, &tz_begin_temp); time_begin_temp = tv_begin_temp.tv_sec + tv_begin_temp.tv_usec / 1000000.0; + time_begin_temp = tv_begin_temp.tv_sec + tv_begin_temp.tv_usec / 1000000.0; returnCode = pread(ssd_fd, ssd_buffer, SSD_BUFFER_SIZE, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE); if (returnCode < 0) { printf("[ERROR] flushSSDBuffer():-------read from ssd: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE); @@ -322,103 +324,89 @@ write_block(off_t offset, char *ssd_buffer) ssd_buf_hdr->ssd_buf_flag |= SSD_BUF_VALID | SSD_BUF_DIRTY; } } -void -read_band(off_t offset, char *ssd_buffer) + +void read_band(off_t offset, char *ssd_buffer, char *zone_buffer) { - if (BandOrBlock == 1) { - SSD_BUFFER_SIZE = BNDSZ; - } - printf("enter read_band\n"); - void *ssd_buf_block; - bool found = 0; - int returnCode; + printf("read_band\n"); + void *ssd_buf_block; + bool found = 0; + int returnCode; - static SSDBufferTag ssd_buf_tag; - static SSDBufferDesc *ssd_buf_hdr; + static SSDBufferTag ssd_buf_tag; + static SSDBufferDesc *ssd_buf_hdr; + + ssd_buf_tag.offset = offset / ZONESZ * ZONESZ; + if (DEBUG) + printf("[INFO] read band():-------band offset=%lu\n", ssd_buf_tag.offset); + + ssd_buf_hdr = SSDBufferAlloc(ssd_buf_tag, &found); + if (found) { + read_ssd_blocks++; + returnCode = pread(ssd_fd, ssd_buffer, BLCKSZ, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE + offset - ssd_buf_tag.offset); + if (returnCode < 0) { + printf("[ERROR] read():-------read from smr: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset); + exit(-1); + } + } else { + returnCode = smrread(smr_fd, zone_buffer, ZONESZ, ssd_buf_tag.offset); + flush_ssd_blocks++; + returnCode = pwrite(ssd_fd, zone_buffer, SSD_BUFFER_SIZE, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE); + if(returnCode < 0) { + printf("[ERROR]read():-------write to ssd: fd=%d, errorcode=%d,offset=%lu\n", ssd_fd, returnCode, offset); + exit(-1); + } + returnCode = fsync(ssd_fd); + if(returnCode < 0){ + printf("[ERROR] read band():------------fsync\n"); + exit(-1); + } + } + ssd_buf_hdr->ssd_buf_flag &= ~SSD_BUF_VALID; + ssd_buf_hdr->ssd_buf_flag |= SSD_BUF_VALID; - ssd_buf_tag.offset = offset; - static SSDBufferTag band_tag; - band_tag.offset = (offset / BNDSZ); - static SSDBufferTag hdr_tag; - hdr_tag.offset = (band_tag.offset) * BNDSZ; - size_t new_offset = offset - hdr_tag.offset; - char *band_buffer; - returnCode = posix_memalign(&band_buffer, 512, sizeof(char) * BNDSZ); - if (returnCode < 0) { - printf("[ERROR] read_band():-------posix_memalign\n"); - exit(-1); - } - printf("readband_tag%ld\n", band_tag.offset); - if (DEBUG) - printf("[INFO] read():-------offset=%lu\n", offset); - ssd_buf_hdr = SSDBufferAlloc(hdr_tag, &found); - if (found) { - returnCode = pread(ssd_fd, ssd_buffer, SSD_BUFFER_SIZE, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE + new_offset); - if (returnCode < 0) { - printf("[ERROR] read():-------read from smr: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset); - exit(-1); - } - } else { - returnCode = smrread(smr_fd, band_buffer, BNDSZ, hdr_tag.offset); - //returnCode = pread(smr_fd, ssd_buffer, SSD_BUFFER_SIZE, offset); - if (returnCode < 0) { - printf("[ERROR] read():-------read from smr: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset); - exit(-1); - } - flush_ssd_blocks++; - returnCode = pwrite(ssd_fd, ssd_buffer, SSD_BUFFER_SIZE, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE); - returnCode = pwrite(ssd_fd, band_buffer, BNDSZ, ssd_buf_hdr->ssd_buf_id * BNDSZ); - if (returnCode < 0) { - printf("[ERROR] read():-------write to ssd: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset); - exit(-1); - } - } - ssd_buf_hdr->ssd_buf_flag &= ~SSD_BUF_VALID; - ssd_buf_hdr->ssd_buf_flag |= SSD_BUF_VALID; } -void -write_band(off_t offset, char *ssd_buffer) -{ - if (BandOrBlock == 1) { - SSD_BUFFER_SIZE = BNDSZ; - } - void *ssd_buf_block; - bool found; - int returnCode; - static SSDBufferTag ssd_buf_tag; - static SSDBufferDesc *ssd_buf_hdr; +void write_band(off_t offset, char *ssd_buffer, char *zone_buffer) +{ + void *ssd_buf_block; + bool found; + int returnCode; - ssd_buf_tag.offset = offset; - static SSDBufferTag band_tag; - band_tag.offset = (offset / BNDSZ); - static SSDBufferTag hdr_tag; - hdr_tag.offset = (band_tag.offset) * BNDSZ; - size_t new_offset = offset - hdr_tag.offset; - char *band_buffer; - if (DEBUG) - printf("[INFO] write():-------offset=%lu\n", offset); + static SSDBufferTag ssd_buf_tag; + static SSDBufferDesc *ssd_buf_hdr; - returnCode = posix_memalign(&band_buffer, 512, sizeof(char) * BNDSZ); - if (returnCode < 0) { - printf("[ERROR] write_band():-------posix_memalign\n"); - exit(-1); - } - ssd_buf_hdr = SSDBufferAlloc(hdr_tag, &found); - flush_ssd_blocks++; - if (flush_ssd_blocks % 10000 == 0) - printf("hit num:%lu flush_ssd_blocks:%lu flush_fifo_times:%lu flush_fifo_blocks:%lu flusd_bands:%lu\n ", hit_num, flush_ssd_blocks, flush_fifo_times, flush_fifo_blocks, flush_bands); - if (found) { - returnCode = pwrite(ssd_fd, ssd_buffer, SSD_BUFFER_SIZE, ssd_buf_hdr->ssd_buf_id * BNDSZ + new_offset); - } else { - returnCode = smrread(smr_fd, band_buffer, BNDSZ, hdr_tag.offset); + ssd_buf_tag.offset = offset / ZONESZ * ZONESZ; + if (DEBUG) + printf("[INFO] write():-------offset=%lu\n", offset); - if (returnCode < 0) { - printf("[ERROR] write():-------write to ssd: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset); - exit(-1); - } - memcpy(band_buffer + new_offset, ssd_buffer, BLCKSZ); - } - ssd_buf_hdr->ssd_buf_flag |= SSD_BUF_VALID | SSD_BUF_DIRTY; + ssd_buf_hdr = SSDBufferAlloc(ssd_buf_tag, &found); + if (found) { + flush_ssd_blocks++; + returnCode = pwrite(ssd_fd, ssd_buffer, BLCKSZ, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE + offset - ssd_buf_tag.offset); + if (returnCode < 0) { + printf("[ERROR] write():-------write to ssd: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset); + exit(-1); + } + returnCode = fsync(ssd_fd); + if(returnCode < 0){ + printf("[ERROR] write band():--------fsync\n"); + exit(-1); + } + } else { + returnCode = smrread(smr_fd, zone_buffer, ZONESZ, ssd_buf_tag.offset); + if (returnCode < 0) { + printf("[ERROR] write():-------write to ssd: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset); + exit(-1); + } + memcpy(zone_buffer + offset - ssd_buf_tag.offset, ssd_buffer, BLCKSZ); + flush_ssd_zones++; + if(flush_ssd_zones % 10000 == 0) + printf("flush_ssd_zones:%lu\n",flush_ssd_zones); + returnCode = pwrite(ssd_fd, zone_buffer, SSD_BUFFER_SIZE, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE); + if(returnCode < 0) { + printf("[ERROR] write band():---------write to ssd: ssd_fd:%d, errorcode=%d, offset = %lu\n",ssd_fd, returnCode,ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE); + } + } + ssd_buf_hdr->ssd_buf_flag |= SSD_BUF_VALID | SSD_BUF_DIRTY; } diff --git a/src/ssd-cache.h b/src/ssd-cache.h index 1cb287d..32cdb41 100644 --- a/src/ssd-cache.h +++ b/src/ssd-cache.h @@ -54,6 +54,7 @@ typedef enum } SSDEvictionStrategy; extern size_t BNDSZ; +extern size_t ZONESZ; extern int BandOrBlock; extern SSDBufferDesc *ssd_buffer_descriptors; extern SSDBufferHashBucket *ssd_buffer_hashtable; @@ -61,6 +62,7 @@ extern SSDBufferStrategyControl *ssd_buffer_strategy_control; extern unsigned long hit_num; extern unsigned long flush_ssd_blocks; extern unsigned long read_ssd_blocks; +extern unsigned long flush_ssd_zones; extern double time_read_ssd; extern double time_write_ssd; extern double time_begin_temp; @@ -74,8 +76,8 @@ extern unsigned long read_hit_num; extern void initSSDBuffer(); extern void read_block(off_t offset, char* ssd_buffer); extern void write_block(off_t offset, char* ssd_buffer); -extern void read_band(off_t offset, char* ssd_buffer); -extern void write_band(off_t offset, char* ssd_buffer); +extern void read_band(off_t offset, char* ssd_buffer, char *zone_buffer); +extern void write_band(off_t offset, char* ssd_buffer, char *zone_buffer); //extern int read(unsigned offset); //extern int write(unsigned offset); diff --git a/src/strategy/maxcold.h b/src/strategy/maxcold.h index 947195f..d8c0dad 100644 --- a/src/strategy/maxcold.h +++ b/src/strategy/maxcold.h @@ -48,7 +48,7 @@ typedef struct unsigned char ischosen; } BandDescForMaxColdNow; -extern size_t ZONESZ; +//extern size_t ZONESZ; extern unsigned long NBANDTables; extern unsigned long NSMRBands; extern unsigned long PERIODTIMES; diff --git a/src/trace2call.c b/src/trace2call.c index db6ba66..e441d22 100644 --- a/src/trace2call.c +++ b/src/trace2call.c @@ -30,6 +30,7 @@ trace_to_iocall(char *trace_file_path) bool is_first_call = 1; int i; float size_float; + char *zone_buffer; gettimeofday(&tv_begin, &tz_begin); time_begin = tv_begin.tv_sec + tv_begin.tv_usec / 1000000.0; @@ -39,6 +40,13 @@ trace_to_iocall(char *trace_file_path) free(ssd_buffer); exit(-1); } + if(BandOrBlock == 1){ + returnCode = posix_memalign(&zone_buffer,512,sizeof(char)*ZONESZ); + if(returnCode < 0){ + printf("[ERROR] flushSSDBuffer():--------posix memalign\n"); + exit(-1); + } + } while (!feof(trace)) { returnCode = fscanf(trace, "%c %d %lu\n", &action, &i, &offset); if (returnCode < 0) @@ -73,14 +81,14 @@ trace_to_iocall(char *trace_file_path) if (BandOrBlock == 0) write_block(offset, ssd_buffer); else - write_band(offset, ssd_buffer); + write_band(offset, ssd_buffer, zone_buffer); } else if (action == '0') { if (DEBUG) printf("[INFO] trace_to_iocall():--------read offset=%lu\n", offset); //if (BandOrBlock == 0) // read_block(offset, ssd_buffer); //else - // read_band(offset, ssd_buffer); + // read_band(offset, ssd_buffer, zone_buffer); } offset += BLCKSZ; size -= BLCKSZ;