- Timestamp:
- Jan 25, 2021, 3:45:42 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- c292244
- Parents:
- b6a8b31 (diff), 7158202 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- benchmark/io
- Files:
-
- 2 added
- 7 edited
-
http/filecache.cfa (modified) (4 diffs)
-
http/http_ring.cpp (added)
-
http/main.cfa (modified) (7 diffs)
-
http/options.cfa (modified) (8 diffs)
-
http/options.hfa (modified) (2 diffs)
-
http/protocol.cfa (modified) (11 diffs)
-
http/protocol.hfa (modified) (2 diffs)
-
http/worker.cfa (modified) (6 diffs)
-
setup.sh (added)
Legend:
- Unmodified
- Added
- Removed
-
benchmark/io/http/filecache.cfa
rb6a8b31 rd95969a 4 4 #include <string.h> 5 5 6 #include <fstream.hfa> 6 7 #include <stdlib.hfa> 7 8 … … 182 183 conflicts += put_file( raw[i], fd ); 183 184 } 184 printf("Filled cache from path \"%s\" with %zu files\n", path, fcount);185 sout | "Filled cache from path \"" | path | "\" with" | fcount | "files"; 185 186 if( conflicts > 0 ) { 186 printf("Found %d conflicts (seed: %u)\n", conflicts, options.file_cache.hash_seed);187 sout | "Found" | conflicts | "conflicts (seed: " | options.file_cache.hash_seed | ")"; 187 188 #if defined(REJECT_CONFLICTS) 188 189 abort("Conflicts found in the cache"); … … 191 192 192 193 if(options.file_cache.list) { 193 printf("Listing files and exiting\n");194 sout | "Listing files and exiting"; 194 195 for(i; fcount) { 195 196 int s; char u; 196 197 [s, u] = human_size(raw[i].size); 197 printf("%4d%c - %s\n", s, u, raw[i].file);198 sout | s | u | "-" | raw[i].file; 198 199 free(raw[i].file); 199 200 } … … 208 209 209 210 [int *, int] filefds(int extra) { 211 if(!options.file_cache.path) { 212 int * data = alloc(extra); 213 return [data, 0]; 214 } 215 210 216 if(!file_cache.entries) { 211 217 abort("File cache not filled!\n"); -
benchmark/io/http/main.cfa
rb6a8b31 rd95969a 6 6 #include <unistd.h> 7 7 extern "C" { 8 #include <signal.h> 8 9 #include <sys/socket.h> 9 10 #include <netinet/in.h> 10 11 } 11 12 13 #include <fstream.hfa> 12 14 #include <kernel.hfa> 15 #include <iofwd.hfa> 13 16 #include <stats.hfa> 14 17 #include <time.hfa> … … 50 53 51 54 //============================================================================================= 55 // Stats Printer 56 //=============================================================================================' 57 58 thread StatsPrinter {}; 59 60 void ?{}( StatsPrinter & this ) { 61 ((thread&)this){ "Stats Printer Thread" }; 62 } 63 64 void main(StatsPrinter & this) { 65 LOOP: for() { 66 waitfor( ^?{} : this) { 67 break LOOP; 68 } 69 or else {} 70 71 sleep(10`s); 72 73 print_stats_now( *options.clopts.instance, CFA_STATS_READY_Q | CFA_STATS_IO ); 74 } 75 } 76 77 //============================================================================================= 52 78 // Main 53 79 //=============================================================================================' 54 80 int main( int argc, char * argv[] ) { 81 __sighandler_t s = 1p; 82 signal(SIGPIPE, s); 83 55 84 //=================== 56 85 // Parse args 57 const char * path =parse_options(argc, argv);86 parse_options(argc, argv); 58 87 59 88 //=================== 60 89 // Open Files 61 printf("Filling cache from %s\n", path); 62 fill_cache( path ); 90 if( options.file_cache.path ) { 91 sout | "Filling cache from" | options.file_cache.path; 92 fill_cache( options.file_cache.path ); 93 } 63 94 64 95 //=================== 65 96 // Open Socket 66 printf("%ld : Listening on port %d\n", getpid(), options.socket.port);97 sout | getpid() | ": Listening on port" | options.socket.port; 67 98 int server_fd = socket(AF_INET, SOCK_STREAM, 0); 68 99 if(server_fd < 0) { … … 84 115 if(errno == EADDRINUSE) { 85 116 if(waited == 0) { 86 printf("Waiting for port\n");117 sout | "Waiting for port"; 87 118 } else { 88 printf("\r%d", waited);89 f flush(stdout);119 sout | "\r" | waited | nonl; 120 flush( sout ); 90 121 } 91 122 waited ++; … … 122 153 } 123 154 124 if(options.file_cache. fixed_fds) {155 if(options.file_cache.path && options.file_cache.fixed_fds) { 125 156 register_fixed_files(cl, fds, pipe_off); 126 157 } … … 128 159 { 129 160 ServerProc procs[options.clopts.nprocs]; 161 StatsPrinter printer; 130 162 131 163 init_protocol(); … … 148 180 unpark( workers[i] ); 149 181 } 150 printf("%d workers started on %d processors\n", options.clopts.nworkers, options.clopts.nprocs);182 sout | options.clopts.nworkers | "workers started on" | options.clopts.nprocs | "processors"; 151 183 { 152 184 char buffer[128]; 153 while( !feof(stdin)) {154 fgets(buffer, 128, stdin);185 while(int ret = cfa_read(0, buffer, 128, 0, -1`s, 0p, 0p); ret != 0) { 186 if(ret < 0) abort( "main read error: (%d) %s\n", (int)errno, strerror(errno) ); 155 187 } 156 188 157 printf("Shutting Down\n"); 158 } 159 189 sout | "Shutdown received"; 190 } 191 192 sout | "Notifying connections..." | nonl; flush( sout ); 160 193 for(i; options.clopts.nworkers) { 161 printf("Cancelling %p\n", (void*)workers[i].cancel.target);162 194 workers[i].done = true; 163 195 cancel(workers[i].cancel); 164 196 } 165 166 printf("Shutting down socket\n"); 197 sout | "done"; 198 199 sout | "Shutting down socket..." | nonl; flush( sout ); 167 200 int ret = shutdown( server_fd, SHUT_RD ); 168 if( ret < 0 ) { abort( "shutdown error: (%d) %s\n", (int)errno, strerror(errno) ); } 201 if( ret < 0 ) { 202 abort( "shutdown error: (%d) %s\n", (int)errno, strerror(errno) ); 203 } 204 sout | "done"; 169 205 170 206 //=================== 171 207 // Close Socket 172 printf("Closing Socket\n");208 sout | "Closing Socket..." | nonl; flush( sout ); 173 209 ret = close( server_fd ); 174 210 if(ret < 0) { 175 211 abort( "close socket error: (%d) %s\n", (int)errno, strerror(errno) ); 176 212 } 213 sout | "done"; 214 215 sout | "Stopping connection threads..." | nonl; flush( sout ); 177 216 } 178 printf("Workers Closed\n"); 179 217 sout | "done"; 218 219 sout | "Stopping protocol threads..." | nonl; flush( sout ); 180 220 deinit_protocol(); 181 } 182 221 sout | "done"; 222 223 sout | "Stopping processors..." | nonl; flush( sout ); 224 } 225 sout | "done"; 226 227 sout | "Closing splice fds..." | nonl; flush( sout ); 183 228 for(i; pipe_cnt) { 184 229 ret = close( fds[pipe_off + i] ); … … 188 233 } 189 234 free(fds); 190 191 } 235 sout | "done"; 236 237 sout | "Stopping processors..." | nonl; flush( sout ); 238 } 239 sout | "done"; 192 240 193 241 //=================== 194 242 // Close Files 195 printf("Closing Files\n"); 196 close_cache(); 197 } 243 if( options.file_cache.path ) { 244 sout | "Closing open files..." | nonl; flush( sout ); 245 close_cache(); 246 sout | "done"; 247 } 248 } -
benchmark/io/http/options.cfa
rb6a8b31 rd95969a 9 9 } 10 10 11 #include <bitmanip.hfa> 12 #include <fstream.hfa> 11 13 #include <kernel.hfa> 12 14 #include <parseargs.hfa> 13 15 16 #include <stdlib.h> 14 17 #include <string.h> 15 18 … … 18 21 19 22 { // file_cache 23 0, // path 20 24 0, // open_flags; 21 25 42u, // hash_seed; … … 34 38 1, // nprocs; 35 39 1, // nworkers; 36 0, // flags;40 {}, // params; 37 41 false, // procstats 38 42 false, // viewhalts … … 41 45 }; 42 46 43 const char *parse_options( int argc, char * argv[] ) {47 void parse_options( int argc, char * argv[] ) { 44 48 bool subthrd = false; 45 49 bool eagrsub = false; … … 48 52 bool iokpoll = false; 49 53 unsigned sublen = 16; 54 unsigned nentries = 16; 55 50 56 51 57 static cfa_option opt[] = { 52 {'p', "port", "Port the server will listen on", options.socket.port}, 53 {'c', "cpus", "Number of processors to use", options.clopts.nprocs}, 54 {'L', "log", "Enable logs", options.log, parse_settrue}, 55 {'t', "threads", "Number of worker threads to use", options.clopts.nworkers}, 56 {'b', "accept-backlog", "Maximum number of pending accepts", options.socket.backlog}, 57 {'r', "request_len", "Maximum number of bytes in the http request, requests with more data will be answered with Http Code 414", options.socket.buflen}, 58 {'S', "seed", "seed to use for hashing", options.file_cache.hash_seed }, 59 {'C', "cache-size", "Size of the cache to use, if set to small, will uses closes power of 2", options.file_cache.size }, 60 {'l', "list-files", "List the files in the specified path and exit", options.file_cache.list, parse_settrue }, 61 {'s', "submitthread", "If set, cluster uses polling thread to submit I/O", subthrd, parse_settrue }, 62 {'e', "eagersubmit", "If set, cluster submits I/O eagerly but still aggregates submits", eagrsub, parse_settrue}, 63 {'f', "fixed-fds", "If set, files are open eagerly and pre-registered with the cluster", fixedfd, parse_settrue}, 64 {'k', "kpollsubmit", "If set, cluster uses IORING_SETUP_SQPOLL, implies -f", sqkpoll, parse_settrue }, 65 {'i', "kpollcomplete", "If set, cluster uses IORING_SETUP_IOPOLL", iokpoll, parse_settrue }, 66 {'L', "submitlength", "Max number of submitions that can be submitted together", sublen }, 58 { 'p', "port", "Port the server will listen on", options.socket.port}, 59 { 'c', "cpus", "Number of processors to use", options.clopts.nprocs}, 60 { 't', "threads", "Number of worker threads to use", options.clopts.nworkers}, 61 {'\0', "log", "Enable logs", options.log, parse_settrue}, 62 {'\0', "accept-backlog", "Maximum number of pending accepts", options.socket.backlog}, 63 {'\0', "request_len", "Maximum number of bytes in the http request, requests with more data will be answered with Http Code 414", options.socket.buflen}, 64 {'\0', "seed", "seed to use for hashing", options.file_cache.hash_seed }, 65 {'\0', "cache-size", "Size of the cache to use, if set to small, will uses closes power of 2", options.file_cache.size }, 66 {'\0', "list-files", "List the files in the specified path and exit", options.file_cache.list, parse_settrue }, 67 { 's', "submitthread", "If set, cluster uses polling thread to submit I/O", subthrd, parse_settrue }, 68 { 'e', "eagersubmit", "If set, cluster submits I/O eagerly but still aggregates submits", eagrsub, parse_settrue}, 69 { 'f', "fixed-fds", "If set, files are open eagerly and pre-registered with the cluster", fixedfd, parse_settrue}, 70 { 'k', "kpollsubmit", "If set, cluster uses IORING_SETUP_SQPOLL, implies -f", sqkpoll, parse_settrue }, 71 { 'i', "kpollcomplete", "If set, cluster uses IORING_SETUP_IOPOLL", iokpoll, parse_settrue }, 72 {'\0', "submitlength", "Max number of submitions that can be submitted together", sublen }, 73 {'\0', "numentries", "Number of I/O entries", nentries }, 67 74 68 75 }; … … 71 78 char **left; 72 79 parse_args( argc, argv, opt, opt_cnt, "[OPTIONS]... [PATH]\ncforall http server", left ); 80 81 if( !is_pow2(nentries) ) { 82 unsigned v = nentries; 83 v--; 84 v |= v >> 1; 85 v |= v >> 2; 86 v |= v >> 4; 87 v |= v >> 8; 88 v |= v >> 16; 89 v++; 90 serr | "Warning: num_entries not a power of 2" | '(' | nentries | ')' | "raising to " | v; 91 nentries = v; 92 } 93 options.clopts.params.num_entries = nentries; 73 94 74 95 options.clopts.params.poller_submits = subthrd; … … 91 112 options.clopts.params.num_ready = sublen; 92 113 93 if( left[0] == 0p ) { return "."; }114 if( left[0] == 0p ) { return; } 94 115 95 116 const char * path = left[0]; … … 97 118 98 119 if( left[0] != 0p ) { 99 abort("Too many trailing arguments!\n"); 120 serr | "Too many trailing arguments!" | '\'' | path | '\''; 121 while(left[0] != 0p) { 122 serr | " - " | left[0]; 123 left++; 124 } 125 exit(EXIT_FAILURE); 100 126 } 101 127 102 returnpath;128 options.file_cache.path = path; 103 129 } -
benchmark/io/http/options.hfa
rb6a8b31 rd95969a 11 11 12 12 struct { 13 const char * path; 13 14 int open_flags; 14 15 uint32_t hash_seed; … … 36 37 extern Options options; 37 38 38 const char *parse_options( int argc, char * argv[] );39 void parse_options( int argc, char * argv[] ); -
benchmark/io/http/protocol.cfa
rb6a8b31 rd95969a 5 5 #include <fcntl.h> 6 6 } 7 8 #include <fstream.hfa> 7 9 #include <iofwd.hfa> 8 10 … … 11 13 extern "C" { 12 14 int snprintf ( char * s, size_t n, const char * format, ... ); 13 #include <linux/io_uring.h>15 // #include <linux/io_uring.h> 14 16 } 15 17 #include <string.h> … … 24 26 "HTTP/1.1 400 Bad Request\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n", 25 27 "HTTP/1.1 404 Not Found\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n", 28 "HTTP/1.1 405 Method Not Allowed\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n", 29 "HTTP/1.1 408 Request Timeout\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n", 26 30 "HTTP/1.1 413 Payload Too Large\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n", 27 31 "HTTP/1.1 414 URI Too Long\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n", … … 34 38 400, 35 39 404, 40 405, 41 408, 36 42 413, 37 43 414, … … 49 55 int ret = cfa_write(fd, it, len, 0, -1`s, 0p, 0p); 50 56 // int ret = write(fd, it, len); 51 if( ret < 0 ) { if( errno != EAGAIN && errno != EWOULDBLOCK) abort( "'answer error' error: (%d) %s\n", (int)errno, strerror(errno) ); } 57 if( ret < 0 ) { 58 if( errno == ECONNRESET || errno == EPIPE ) return -ECONNRESET; 59 if( errno == EAGAIN || errno == EWOULDBLOCK) return -EAGAIN; 60 61 abort( "'answer error' error: (%d) %s\n", (int)errno, strerror(errno) ); 62 } 52 63 53 64 // update it/len … … 94 105 if(ret < 0 ) { 95 106 if( errno == EAGAIN || errno == EWOULDBLOCK) continue READ; 96 // if( errno == EINVAL ) return [E400, true, 0, 0]; 107 if( errno == ECONNRESET ) return [E408, true, 0, 0]; 108 if( errno == EPIPE ) return [E408, true, 0, 0]; 97 109 abort( "read error: (%d) %s\n", (int)errno, strerror(errno) ); 98 110 } … … 108 120 } 109 121 110 if( options.log ) printf("%.*s\n", rlen, buffer); 122 if( options.log ) { 123 write(sout, buffer, rlen); 124 sout | nl; 125 } 111 126 112 127 it = buffer; … … 119 134 } 120 135 121 voidsendfile( int pipe[2], int fd, int ans_fd, size_t count ) {136 int sendfile( int pipe[2], int fd, int ans_fd, size_t count ) { 122 137 unsigned sflags = SPLICE_F_MOVE; // | SPLICE_F_MORE; 123 138 off_t offset = 0; … … 128 143 if( ret < 0 ) { 129 144 if( errno != EAGAIN && errno != EWOULDBLOCK) continue SPLICE1; 145 if( errno == ECONNRESET ) return -ECONNRESET; 146 if( errno == EPIPE ) return -EPIPE; 130 147 abort( "splice [0] error: (%d) %s\n", (int)errno, strerror(errno) ); 131 148 } … … 139 156 if( ret < 0 ) { 140 157 if( errno != EAGAIN && errno != EWOULDBLOCK) continue SPLICE2; 158 if( errno == ECONNRESET ) return -ECONNRESET; 159 if( errno == EPIPE ) return -EPIPE; 141 160 abort( "splice [1] error: (%d) %s\n", (int)errno, strerror(errno) ); 142 161 } … … 145 164 146 165 } 166 return count; 147 167 } 148 168 -
benchmark/io/http/protocol.hfa
rb6a8b31 rd95969a 7 7 E400, 8 8 E404, 9 E405, 10 E408, 9 11 E413, 10 12 E414, … … 21 23 [HttpCode code, bool closed, * const char file, size_t len] http_read(int fd, []char buffer, size_t len, io_cancellation *); 22 24 23 voidsendfile( int pipe[2], int fd, int ans_fd, size_t count );25 int sendfile( int pipe[2], int fd, int ans_fd, size_t count ); -
benchmark/io/http/worker.cfa
rb6a8b31 rd95969a 6 6 #include <unistd.h> 7 7 8 #include <fstream.hfa> 8 9 #include <iofwd.hfa> 9 10 … … 33 34 CONNECTION: 34 35 for() { 35 if( options.log ) printf("=== Accepting connection ===\n");36 if( options.log ) sout | "=== Accepting connection ==="; 36 37 int fd = cfa_accept4( this.[sockfd, addr, addrlen, flags], 0, -1`s, &this.cancel, 0p ); 37 38 // int fd = accept4( this.[sockfd, addr, addrlen, flags] ); 38 39 if(fd < 0) { 39 40 if( errno == ECONNABORTED ) break; 40 if( errno == EINVAL && this.done) break;41 if( this.done && (errno == EINVAL || errno == EBADF) ) break; 41 42 abort( "accept error: (%d) %s\n", (int)errno, strerror(errno) ); 42 43 } 43 44 44 if( options.log ) printf("=== New connection %d, waiting for requests ===\n", fd);45 if( options.log ) sout | "=== New connection" | fd | "" | ", waiting for requests ==="; 45 46 REQUEST: 46 47 for() { … … 53 54 size_t len = options.socket.buflen; 54 55 char buffer[len]; 55 if( options.log ) printf("=== Reading request ===\n");56 if( options.log ) sout | "=== Reading request ==="; 56 57 [code, closed, file, name_size] = http_read(fd, buffer, len, &this.cancel); 57 58 58 59 // if we are done, break out of the loop 59 if( closed ) { 60 if( options.log ) printf("=== Connection closed ===\n"); 61 close(fd); 62 continue CONNECTION; 63 } 60 if( closed ) break REQUEST; 64 61 65 62 // If this wasn't a request retrun 400 66 63 if( code != OK200 ) { 67 printf("=== Invalid Request : %d ===\n", code_val(code));64 sout | "=== Invalid Request :" | code_val(code) | "==="; 68 65 answer_error(fd, code); 69 66 continue REQUEST; … … 71 68 72 69 if(0 == strncmp(file, "plaintext", min(name_size, sizeof("plaintext") ))) { 73 if( options.log ) printf("=== Request for /plaintext ===\n");70 if( options.log ) sout | "=== Request for /plaintext ==="; 74 71 75 72 char text[] = "Hello, World!\n"; 76 73 77 74 // Send the header 78 answer_plain(fd, text, sizeof(text)); 75 int ret = answer_plain(fd, text, sizeof(text)); 76 if( ret == -ECONNRESET ) break REQUEST; 79 77 80 if( options.log ) printf("=== Answer sent ===\n");78 if( options.log ) sout | "=== Answer sent ==="; 81 79 continue REQUEST; 82 80 } 83 81 84 82 if(0 == strncmp(file, "ping", min(name_size, sizeof("ping") ))) { 85 if( options.log ) printf("=== Request for /ping ===\n");83 if( options.log ) sout | "=== Request for /ping ==="; 86 84 87 85 // Send the header 88 answer_empty(fd); 86 int ret = answer_empty(fd); 87 if( ret == -ECONNRESET ) break REQUEST; 89 88 90 if( options.log ) printf("=== Answer sent ===\n");89 if( options.log ) sout | "=== Answer sent ==="; 91 90 continue REQUEST; 92 91 } 93 92 94 if( options.log ) printf("=== Request for file %.*s ===\n", (int)name_size, file); 93 if( options.log ) { 94 sout | "=== Request for file " | nonl; 95 write(sout, file, name_size); 96 sout | " ==="; 97 } 98 99 if( !options.file_cache.path ) { 100 if( options.log ) { 101 sout | "=== File Not Found (" | nonl; 102 write(sout, file, name_size); 103 sout | ") ==="; 104 } 105 answer_error(fd, E405); 106 continue REQUEST; 107 } 95 108 96 109 // Get the fd from the file cache … … 101 114 // If we can't find the file, return 404 102 115 if( ans_fd < 0 ) { 103 printf("=== File Not Found ===\n"); 116 if( options.log ) { 117 sout | "=== File Not Found (" | nonl; 118 write(sout, file, name_size); 119 sout | ") ==="; 120 } 104 121 answer_error(fd, E404); 105 122 continue REQUEST; … … 107 124 108 125 // Send the header 109 answer_header(fd, count); 126 int ret = answer_header(fd, count); 127 if( ret == -ECONNRESET ) break REQUEST; 110 128 111 129 // Send the desired file 112 sendfile( this.pipe, fd, ans_fd, count); 130 ret = sendfile( this.pipe, fd, ans_fd, count); 131 if( ret == -ECONNRESET ) break REQUEST; 113 132 114 if( options.log ) printf("=== Answer sent ===\n");133 if( options.log ) sout | "=== Answer sent ==="; 115 134 } 135 136 if( options.log ) sout | "=== Connection closed ==="; 137 close(fd); 138 continue CONNECTION; 116 139 } 117 140 }
Note:
See TracChangeset
for help on using the changeset viewer.