From 14795161ec44f02a8375eea8b515d6f6331182e1 Mon Sep 17 00:00:00 2001 From: MasterRoby3 Date: Mon, 21 Aug 2023 23:39:16 +0200 Subject: [PATCH] Various changes and extended preliminary testing --- a.out | Bin 62536 -> 17656 bytes evBuild.out | Bin 17440 -> 17808 bytes event_builder.cxx | 91 +- provider.cxx | 2 +- spawn_clients.sh | 12 + testing/buffer_size/client.out | Bin 0 -> 48728 bytes testing/buffer_size/client_buffer_size.cxx | 105 ++ testing/buffer_size/server.out | Bin 0 -> 17408 bytes testing/buffer_size/server_consume_data.cxx | 91 ++ .../epoll_data_stats_100.csv | 19 + .../epoll_data_stats_1000.csv | 19 + .../epoll_data_stats_1000_TIMEOUT.csv | 19 + .../epoll_data_stats_1000_TIMEOUT_HARD.csv | 19 + .../epoll_data_stats_500.csv | 19 + .../connection_method/ev_builder_epoll.out | Bin 0 -> 62120 bytes .../connection_method/ev_builder_select.out | Bin 0 -> 57856 bytes .../connection_method/event_builder_epoll.cxx | 283 +++++ .../event_builder_select.cxx | 301 +++++ .../connection_method/fragment_dataformat.h | 56 + .../notes_on_connection_method.md | 46 + testing/connection_method/prov.out | Bin 0 -> 17752 bytes testing/connection_method/provider.cxx | 80 ++ testing/connection_method/readme.txt | 17 + ...ct_data_stats_1000desc_NOBLOCK_TIMEOUT.csv | 19 + ...ta_stats_1000desc_NOBLOCK_TIMEOUT_HARD.csv | 19 + testing/connection_method/spawn_clients.sh | 15 + testing/results/select_data_stats.csv | 19 + .../select_data_stats_1000desc_NOBLOCK.csv | 19 + testing/results/select_data_stats_100desc.csv | 19 + .../select_data_stats_100desc_NOBLOCK.csv | 19 + .../select_data_stats_500desc_NOBLOCK.csv | 19 + testing/results/send_data_buffer.csv | 1002 +++++++++++++++++ 32 files changed, 2325 insertions(+), 4 deletions(-) create mode 100755 spawn_clients.sh create mode 100755 testing/buffer_size/client.out create mode 100644 testing/buffer_size/client_buffer_size.cxx create mode 100755 testing/buffer_size/server.out create mode 100644 testing/buffer_size/server_consume_data.cxx create mode 100644 testing/connection_method/epoll_data_stats_100.csv create mode 100644 testing/connection_method/epoll_data_stats_1000.csv create mode 100644 testing/connection_method/epoll_data_stats_1000_TIMEOUT.csv create mode 100644 testing/connection_method/epoll_data_stats_1000_TIMEOUT_HARD.csv create mode 100644 testing/connection_method/epoll_data_stats_500.csv create mode 100755 testing/connection_method/ev_builder_epoll.out create mode 100755 testing/connection_method/ev_builder_select.out create mode 100644 testing/connection_method/event_builder_epoll.cxx create mode 100644 testing/connection_method/event_builder_select.cxx create mode 100644 testing/connection_method/fragment_dataformat.h create mode 100644 testing/connection_method/notes_on_connection_method.md create mode 100755 testing/connection_method/prov.out create mode 100644 testing/connection_method/provider.cxx create mode 100644 testing/connection_method/readme.txt create mode 100644 testing/connection_method/select_data_stats_1000desc_NOBLOCK_TIMEOUT.csv create mode 100644 testing/connection_method/select_data_stats_1000desc_NOBLOCK_TIMEOUT_HARD.csv create mode 100755 testing/connection_method/spawn_clients.sh create mode 100644 testing/results/select_data_stats.csv create mode 100644 testing/results/select_data_stats_1000desc_NOBLOCK.csv create mode 100644 testing/results/select_data_stats_100desc.csv create mode 100644 testing/results/select_data_stats_100desc_NOBLOCK.csv create mode 100644 testing/results/select_data_stats_500desc_NOBLOCK.csv create mode 100644 testing/results/send_data_buffer.csv diff --git a/a.out b/a.out index 193102b3231aa8487231e222c23ea806f537fd70..37154d7a9ee91ead565b464b4a02ffcd32231146 100755 GIT binary patch literal 17656 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%0A0U|Pyjr{Zw7<$HM z|M~fiDL$T-iT!6ern^x}?+lpd=RBr{QWu5(Ygp_u=I> z{2qiUzc(R$y7ej4{}eEaiGH0yH!CV>s&AJxsC;!9WE>p%`i9nXX+gjX%!{K1`ux1g zl>Oy8nP>W?0)4*!VtU?fn6kk2v%Rkt==1Y0Q+{8>^3+%P>FZ#qiQIp}(50HT7qp-K z)>7h|$mHu6?%$8Hpr(cO(|6$c`uyC@^u+&C{|}%~&#H6|QR3$@-q&B~FY`?Q1v=F@ zSf8K&CThvr)Ob_e6wmtqi2~{(*5~I${=W%h+JEjw*5iIW23-++tGah literal 62536 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

B6%w!V3Hq-#5dP__Bp#2@#5EZU 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 aaIa&dxT9IOY=ua&NqnPK*K9Bu^Zy8atj1#i diff --git a/event_builder.cxx b/event_builder.cxx index 9c0f8f2..ea35e72 100644 --- a/event_builder.cxx +++ b/event_builder.cxx @@ -10,6 +10,11 @@ #include #include +#include + +#include +#include + int makeSocket() { int sockfd; @@ -44,6 +49,7 @@ void startListening(int server_fd) { int acceptConnection(int server_fd) { int client_fd; struct sockaddr_in remoteAddr; + size_t addrlen = sizeof(remoteAddr); if ((client_fd = accept(server_fd, (struct sockaddr *)&remoteAddr, (socklen_t *)&addrlen)) < 0) { perror("accept"); @@ -91,8 +97,6 @@ int main(int argc, char const *argv[]) { #define TRUE 1 #define FALSE 0 - - int main(int argc, char const *argv[]) { signal(SIGTERM, term_handler); @@ -139,9 +143,90 @@ int main(int argc, char const *argv[]) { FD_SET(master_socket, &readfds); max_sd = master_socket; + //add child sockets to set + for ( i = 0 ; i < max_clients ; i++) + { + //socket descriptor + sd = client_socket[i]; + + //if valid socket descriptor then add to read list + if(sd > 0) + FD_SET( sd , &readfds); + + //highest file descriptor number, need it for the select function + if(sd > max_sd) + max_sd = sd; + } + + //wait for an activity on one of the sockets , timeout is NULL , + //so wait indefinitely + activity = select( max_sd + 1 , &readfds , NULL , NULL , NULL); + + if ((activity < 0) && (errno!=EINTR)) + { + printf("select error"); + } + + //If something happened on the master socket , + //then its an incoming connection + if (FD_ISSET(master_socket, &readfds)) + { + new_socket = acceptConnection(master_socket); + + //add new socket to array of sockets + for (i = 0; i < max_clients; i++) + { + //if position is empty + if( client_socket[i] == 0 ) + { + client_socket[i] = new_socket; + printf("Adding to list of sockets as %d\n" , i); + + break; + } + } + } + + //else its some IO operation on some other socket + for (i = 0; i < max_clients; i++) + { + sd = client_socket[i]; + + if (FD_ISSET( sd , &readfds)) + { + //Check if it was for closing , and also read the + //incoming message + uint32_t word; + if ((valread = recv( sd , &word, 4, 0)) == 0) + { + struct sockaddr_in address; + int addrlen; + //Somebody disconnected , get his details and print + getpeername(sd , (struct sockaddr*)&address , \ + (socklen_t*)&addrlen); + printf("Host disconnected , ip %s , port %d \n" , + inet_ntoa(address.sin_addr) , ntohs(address.sin_port)); + + printf("Disconnected fd %d", sd); + + //Close the socket and mark as 0 in list for reuse + close( sd ); + client_socket[i] = 0; + } + + //Echo back the message that came in + else + { + printf("[RICEVUTO]\t0x%x FROM %d\n", word, sd); + } + } + } + } + /* + int client_fd = acceptConnection(server_fd); while (true) { @@ -152,7 +237,7 @@ int main(int argc, char const *argv[]) { exit(EXIT_FAILURE); } printf("[RICEVUTO]\t0x%x\n", word); - } + }*/ return 0; diff --git a/provider.cxx b/provider.cxx index e2686ae..f5086d9 100644 --- a/provider.cxx +++ b/provider.cxx @@ -133,7 +133,7 @@ int main(int argc, char* argv[]) { encode_fragment(buffer, fragment); ssize_t bytes = send(socket, reinterpret_cast(buffer), sizeof(buffer), 0); if (bytes != header.fragmentSize * sizeof(uint32_t)) { - perror("Send failed: nub bytes not matching"); + perror("Send failed: num bytes not matching"); exit(EXIT_FAILURE); } diff --git a/spawn_clients.sh b/spawn_clients.sh new file mode 100755 index 0000000..57caa28 --- /dev/null +++ b/spawn_clients.sh @@ -0,0 +1,12 @@ +#!/bin/bash +echo "Usage: $0 host port runNumber numberOfProviders" + +if [ $# -eq 4 ] +then + echo "Selected host: $1:$2 runNumber: $3 numberOfProviders: $4" + for i in $(seq 1 $4); + do + echo "Spawning provider number $i" + ./prov.out $1 $2 $3 & + done +fi diff --git a/testing/buffer_size/client.out b/testing/buffer_size/client.out new file mode 100755 index 0000000000000000000000000000000000000000..ac744676d5ffe848fa63cfc78721bbcf78b95ab0 GIT binary patch literal 48728 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 literal 0 HcmV?d00001 diff --git a/testing/buffer_size/client_buffer_size.cxx b/testing/buffer_size/client_buffer_size.cxx new file mode 100644 index 0000000..d50d818 --- /dev/null +++ b/testing/buffer_size/client_buffer_size.cxx @@ -0,0 +1,105 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include + +int makeSocket() { + int sockfd; + if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("socket failed"); + exit(EXIT_FAILURE); + } + return sockfd; +} + +void connectTo(int sock, const char* host, int port) { + struct sockaddr_in serv_addr; + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = inet_addr(host); + serv_addr.sin_port = htons(port); + + if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { + perror("Connection failed"); + exit(EXIT_FAILURE); + } + + printf("Connected to %s: %d\n", host, port); +} + +int main(int argc, char* argv[]) { + + int socket = makeSocket(); + connectTo(socket, "127.0.0.1", 7777); + + //allocating 100 megabytes of memory + uint64_t* chunky_boy = new uint64_t[13107200]; + size_t chunky_boy_size = 13107200 * sizeof(uint64_t); + printf("chonky size %d", static_cast(chunky_boy_size)); + sleep(5); + + //setting memory to verify non-emptyness + memset(chunky_boy, 45678832, chunky_boy_size); + + std::vector sizes; + std::vector times; + + + for ( int i = 1; i < 1e6 + 2; i += 1e3) { + + printf("Selected buffer size: %d\n", i); + auto start = std::chrono::high_resolution_clock::now(); + int kilos = 0; + for ( int j = 0; j < chunky_boy_size; ) { + + ssize_t bytes = send(socket, reinterpret_cast(chunky_boy) + j, std::min(static_cast(chunky_boy_size) - j, i), 0); + j += i; + if (j%1024 == 0) { + kilos++; + } + } + + + auto end = std::chrono::high_resolution_clock::now(); + double time_taken = std::chrono::duration_cast(end - start).count(); + + time_taken *= 1e-9; + + times.push_back(time_taken); + sizes.push_back(i); + + std::cout << "Time taken by program is : " << std::fixed + << time_taken << std::setprecision(9); + std::cout << " sec" << std::endl; + } + + std::ofstream fout; + fout.open("send_data_buffer"); + fout << "buffer_size;time;\n"; + auto iter_sizes = sizes.begin(); + auto iter_times = times.begin(); + + for ( ; (iter_sizes != sizes.end()) && (iter_times != times.end()) ; (++iter_sizes, ++iter_times) ) { + fout << *iter_sizes << ";" << *iter_times << ";\n"; + } + + fout.close(); + + + return 0; +} \ No newline at end of file diff --git a/testing/buffer_size/server.out b/testing/buffer_size/server.out new file mode 100755 index 0000000000000000000000000000000000000000..3657290c6ae7dac9493706ed3d32daac65e2135a GIT binary patch literal 17408 zcmeHPeQX@X6`%7Z!~{5-@X_-`YN~@2tCZ zaG)s$1L81-sFW5}MMXtIv}z?l6i}exG&BK(s6z`)sVFW@+jE;zLjf5Pa{axTdFS2D z9jf|ARjD`D?VI;|AM@tz?B34Jj&F>$t*HtG1ec)riXg7`c!fl?VCZ~Z0f~r};usu1 zFFq%Z0zXS)N*+-JQdN4YytG>5K~S=LSj+wNvs#ZSM@W?H%9U!}08>$`G|6r@RWZ+sdJ}cM$<)AL-Qdc`y2cgZY&yJL_WMKxLSt&}`gYOt#G<;rH{ZSL-ZgX5 zZ+!Br-}Ikv-$`*(4CIe=sE|IVpXfY%NUr*I6KV=0y3c;4k7&7aCj>?b;iE_ zP)dIT@I`)Q;(kbo9QmQ2t zWgn|Bp81c)w);=<0gUji(BodRq z0)^AHMCXRfgbSa;AZXr&vo8`)xp0n|@M#zBKJW7*Bo%^u^R-R95uu~P>AL5#B%*4h z&-XS$>LYYi`ueLu@+%{fNdNBpU&MtYp~Ygl@VP}4_gxo$j0?Zig&*s}uXf>d@8HrC zQ8kJ`#2{#YL@|WdsH!{;MifK1K7|UX94i^9WT29PN(L$!sAS;(CIja1!D@44_M6Lu zFmD}mstV)g@blHXi~TR0^EO0<#RqV#Sr|c$_#To^P83iUzd<}b;!TcA{#D}X(Q9%{ z@-Gojk6e?FNdD)<)1%hp1CrlKJUwDf?vVUr#M7hINnm;BAd)1%d-A^G>hLUio_FH6JUTXXxaGIMX6 z!w04|Zf+Z$Jr}W>qsKjnE|{aMuRzZVCp`q4_iGlmNT?MK&C%ISL{?2ZCn25RfSl5K zbYY@q;Sf3AttnibBK6OiM`Y@oKpc20zYcI}|LFwrI3Vf&%g zzlBH)ENeH1S2t4C%>BtZ)*M;A6HLAiUCQ_1uxIw8-~(IOj_KqL5VpexC%$$kMfNP6 zyXWYH<=;A7DCA;?Mq-C{gH7>VU;o*c{V&A;_Yq0p6!y=RWDn;MB7+({4cX6_Y87Q@X<8>7_5qGB5+ zwb7o3MQ#rwxB=3q$Z!7p@VBGbbZu@sh59UwEx3FP!WoxWk;`8KQel698g!+ z%=p`ce3-fI&zO5-FUT-Q+h0J~<0G+WRK)i{Hy1mIpk^95lN!0E*vJmlYMzX}sye@1 za{EVOzeaGsI8-Q@xjodSUAZ^VsY4ins#7mP1l%0iGOfFI)4|9Py7aS`ZzQ9ij)4qI zrpj4jj@(MTIf6t|a^5WZxfy;`XRFaN>kW_L@`mo-{M(SL4oJhNi-xTb&{@#%yPAcfE%#nq?wyw0U!sK*-!g}H2h3G(4*Zqwg;#8eUK!mIy(((q8WOwF z5qZz_+$E`Zl~Tz-B?FZVR5DP>KqUi}3{)~u$-w`91_FAOL@kFIUGZeEosf%MTwl{- zEKV35>48+jaMDJ9I^zJC%d2C$i%Ltam?cx)q?xj>Gdk0$l-=nhvA#B!*UF?tb5US) zWzu~{PdW>?*|XUHS%&mDSF~s2-S)Wvh zS8I;Bu6jsZaO!zqI{S=81d~0cHR4kEr5`=GkS+D|9Q29gA{wf_t*ZIBqi#e%U`hUU zd@h6h2GF9sYO7Qr`So zph__v!lxg(+yW|^LbZ2SwT9;36^w<9(OI$3k~?R&gz9fQ$_%X>p0hR-xhAwS8mf&>zPzm>W=a}j24oqd`1y5 zt{Y~&R`VS9nAYQW`nY|p9?AYdELE{ECiyAdF|0>Pp7V@pl;mI1@{crMj9a(!-zNNC zxxd{;Jr34rdWoi8nr_wfHch{+=|h@6q3Iq?U)S`{ntrG$w|jd;)z&sQpKB~>u{)CS zl+jR+_hTFC8kg#tvAlkHLw!R-JzJHgLA-Iw@7KFEg7~e2-;4L+L6PSH;}Qh%Mrd`3 z6BNYg<#Fm##~3_H@Obv(a|EAvFJ3Kpym;}W1&>27KDRhty*RE8Up`45#8qvS#Bp_( zc=L0yQM+=`oZ@TFMg6JHEx6A zWWnzpd-ZX(N8E_22gQ6bR1!Z$>?n!zU2et~UEj0ByK?P&237adD&#Zb%V!8mg!lV! zN(u^0+(YJ`xHj6T4Hghyb>#JxD&v2s z41P};{Gl@VlV$MNBpwp8Xd?%T{Ou3)Z@{Tv{_ABLxIv1(G6(rTzG}YU`#OtHB%Dr) zp%DG`FHQ$e=Ve@fQOn;9p>npyKhWb@{?-Y+S>nov`?wcOEv}dQB5qWOcM&J~=lk24 zT6_uokiP$Xb?A2Q)_IV>Z^EX#OuO64;CGb4?=OSXey~#GYF8QjRp69ofBe4(Zg^85 zxoPPqBv$E0wiNL$^# z>5h1>m2lFTtQ8*^6rJh5{$AU$6XE*O8nlNdX~i>{_%_QT6_w%QpBiw@ZVvWYwKaOdD4%+_2ST^F-r>su`Bq463fgw=A{`sljWX0JqU z-T{Q&Vph!59?X`Dg|)VALsPWP+OTHLrr2g{bF`@~MqcHXpU&)n?82vR>M3q9ig>mG z*%Yv_E^k;N+isKFkFc1MR2!5$%4$=R2T~i9JP_?u@&HF{O!7)EZ)j8-nr4<~lIR)5 zrM4h}@$N^m64|uX6Hg^*uTtvR1 zA@}Ytk5{!q<$**vyRFZOcYrz>MSHl0oo05XUxZU>#}0R=2ErW!N$hz{CNvanYOQnP z-9pNG;@KV%PHaoTpQ27iNpKZpvF7GsEXXo;Z=4Ktt-se1VR>%CsD``KU>$o9N4g53 zl$IkhZ1?Evt|tK}%qdfK0V)fwqlI{1vJ=gx9rBFeXk>?Razz-ofIeK=CGIu<2}JWy z+}iP7uL?i+Gv#@x7E4{O6FnUtn)|Um&kvZMK}xQ|-&YJZqT;sac?45~6*cwS)A!kj zm9Y zDb06k@L_wN?@rZ`x0&Y@9{{R7vJ+|lh6#xH#2^~L=PqyRpcpq#@h3$F%ynh)$ zlqHH3k8IEMuaLOyMMSICD>|fECTz#_pAfk1hayUINZWIqetYIWLWO*B{QMleL)&vZ ztgq9-tT>DsVOqV2v;7x~h^nx?oATImt3IV24$+qb3VjdJDdl+h{!7;f$Bt^TtX!$8 a=lO)(E-TVy?o*MX?0HIKj?ciyihlu^+vTJH literal 0 HcmV?d00001 diff --git a/testing/buffer_size/server_consume_data.cxx b/testing/buffer_size/server_consume_data.cxx new file mode 100644 index 0000000..e325abd --- /dev/null +++ b/testing/buffer_size/server_consume_data.cxx @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +int makeSocket() { + int sockfd; + if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("socket failed"); + exit(EXIT_FAILURE); + } + return sockfd; +} + +void bindSocketPort(int server_fd, int port) { + struct sockaddr_in localAddr; + localAddr.sin_family = AF_INET; + localAddr.sin_addr.s_addr = INADDR_ANY; + localAddr.sin_port = htons(port); + + if (bind(server_fd, (struct sockaddr *)&localAddr, sizeof(localAddr)) < 0) { + perror("bind failed"); + exit(EXIT_FAILURE); + } + printf("FD %d bound to port %d\n", server_fd, port); +} + +void startListening(int server_fd) { + if (listen(server_fd, 3) < 0) { + perror("listen"); + exit(EXIT_FAILURE); + } + printf("FD %d listening to new connections\n", server_fd); +} + +int acceptConnection(int server_fd) { + int client_fd; + struct sockaddr_in remoteAddr; + size_t addrlen = sizeof(remoteAddr); + if ((client_fd = accept(server_fd, (struct sockaddr *)&remoteAddr, (socklen_t *)&addrlen)) < 0) { + perror("accept"); + exit(EXIT_FAILURE); + } + printf("Connection from host %s, port %d, FD %d\n", inet_ntoa(remoteAddr.sin_addr), ntohs(remoteAddr.sin_port), client_fd); + return client_fd; +} + + +int main(int argc, char* argv[]) { + if (argc != 2) { + printf("Usage: %s portNumber \n", argv[0]); + exit(EXIT_FAILURE); + } + int port = atoi(argv[1]); + printf("Start socket port %d\n", port); + + int server_fd = makeSocket(); + bindSocketPort(server_fd, port); + startListening(server_fd); + int client_fd = acceptConnection(server_fd); + + uint64_t bytes_read = 0; + uint64_t kbytes_read = 0; + + while (true) { + char buffer[32 * 1024] = {0}; + ssize_t bytes = read(client_fd, &buffer, sizeof(buffer)); + + bytes_read += static_cast(bytes); + //printf("tot bytos %lu\n", bytes_read); + + if (uint64_t newkb = (bytes_read / 1024) > 0) { + //printf("before: %lu", bytes_read); + bytes_read -= (1024 * newkb); + //printf("after: %lu", bytes_read); + kbytes_read += newkb; + //printf("Read %d kbytes\n", static_cast(kbytes_read)); + } + } + + return 0; +} \ No newline at end of file diff --git a/testing/connection_method/epoll_data_stats_100.csv b/testing/connection_method/epoll_data_stats_100.csv new file mode 100644 index 0000000..7f3ed08 --- /dev/null +++ b/testing/connection_method/epoll_data_stats_100.csv @@ -0,0 +1,19 @@ +buffer_size;time;total_received_data; +1;30000;45817; +500;30000;16688512; +1000;30000;26801219; +2000;30004.1;40979357; +3000;30000.2;49705756; +4000;30000.1;56029482; +5000;30000.1;60047108; +10000;30000.2;99444868; +20000;30000.2;106228515; +30000;30000.6;103007812; +40000;30000.5;112140625; +50000;30000.8;104677734; +100000;30002.8;119785156; +200000;30001.2;117539062; +300000;30002.7;127939453; +400000;30010.1;121523437; +500000;30004.6;125390625; +1000000;30036.4;126757812; diff --git a/testing/connection_method/epoll_data_stats_1000.csv b/testing/connection_method/epoll_data_stats_1000.csv new file mode 100644 index 0000000..f22d032 --- /dev/null +++ b/testing/connection_method/epoll_data_stats_1000.csv @@ -0,0 +1,19 @@ +buffer_size;time;total_received_data; +1;30000.5;26535; +500;30000.9;12931772; +1000;30000.8;20953270; +2000;30000.7;30575921; +3000;30000.2;37463270; +4000;30003.3;42943248; +5000;30000.4;47972201; +10000;30003.9;57650021; +20000;30001.7;70555676; +30000;30006.6;66315379; +40000;30000.8;64524353; +50000;30006.4;80692139; +100000;30008.4;93501600; +200000;30002.2;103220112; +300000;30010;108385843; +400000;30002.3;110109484; +500000;30041.3;106363740; +1000000;30000;103425306; diff --git a/testing/connection_method/epoll_data_stats_1000_TIMEOUT.csv b/testing/connection_method/epoll_data_stats_1000_TIMEOUT.csv new file mode 100644 index 0000000..be1d0cd --- /dev/null +++ b/testing/connection_method/epoll_data_stats_1000_TIMEOUT.csv @@ -0,0 +1,19 @@ +buffer_size;time;total_received_data; +1;30001.7;23972; +500;30001.1;16452118; +1000;30000;28659540; +2000;30000;43843616; +3000;30000;53965134; +4000;30000;78146535; +5000;30000;81098297; +10000;30000.1;104959571; +20000;30000;103154410; +30000;30000.1;98912274; +40000;30000.2;106528334; +50000;30000;108412018; +100000;30000.1;99869795; +200000;30001.9;113863135; +300000;30006.9;113726256; +400000;30003.6;113588963; +500000;30004.1;124238792; +1000000;30005.3;127730003; diff --git a/testing/connection_method/epoll_data_stats_1000_TIMEOUT_HARD.csv b/testing/connection_method/epoll_data_stats_1000_TIMEOUT_HARD.csv new file mode 100644 index 0000000..7b4d947 --- /dev/null +++ b/testing/connection_method/epoll_data_stats_1000_TIMEOUT_HARD.csv @@ -0,0 +1,19 @@ +buffer_size;time;total_received_data; +1;30000.7;32735; +500;30000;18563821; +1000;30000;33321199; +2000;30000;57600348; +3000;30000;72226712; +4000;30000;80548950; +5000;30000;92428421; +10000;30000;125112074; +20000;30000;130615660; +30000;30000;133488130; +40000;30000;149347337; +50000;30000;141748519; +100000;30000;145676700; +200000;30000.1;167065891; +300000;30000.1;180569049; +400000;30000;186854294; +500000;30000;191359610; +1000000;30000;187503120; diff --git a/testing/connection_method/epoll_data_stats_500.csv b/testing/connection_method/epoll_data_stats_500.csv new file mode 100644 index 0000000..c79d663 --- /dev/null +++ b/testing/connection_method/epoll_data_stats_500.csv @@ -0,0 +1,19 @@ +buffer_size;time;total_received_data; +1;30000.3;38239; +500;30000.3;15008694; +1000;30000.5;24572299; +2000;30000.1;34510344; +3000;30001;41199235; +4000;30000.9;45359880; +5000;30000.5;48985625; +10000;30003.5;59779061; +20000;30003.2;66210747; +30000;30000.4;70755300; +40000;30002.9;91266308; +50000;30005.9;112726855; +100000;30002;120034453; +200000;30004.6;120310170; +300000;30011.9;110168294; +400000;30017;103690777; +500000;30023.6;106875799; +1000000;30065.7;111296658; diff --git a/testing/connection_method/ev_builder_epoll.out b/testing/connection_method/ev_builder_epoll.out new file mode 100755 index 0000000000000000000000000000000000000000..e81bf2d76485dbb853b79b955b3cd22043c92ef1 GIT binary patch literal 62120 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 Xs$Yc~iW{f)`+H=K3vCT-MeY9q77!S< literal 0 HcmV?d00001 diff --git a/testing/connection_method/ev_builder_select.out b/testing/connection_method/ev_builder_select.out new file mode 100755 index 0000000000000000000000000000000000000000..b27f09a895f93ec672e2345e1fd775e583e633f1 GIT binary patch literal 57856 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 literal 0 HcmV?d00001 diff --git a/testing/connection_method/event_builder_epoll.cxx b/testing/connection_method/event_builder_epoll.cxx new file mode 100644 index 0000000..abb52ed --- /dev/null +++ b/testing/connection_method/event_builder_epoll.cxx @@ -0,0 +1,283 @@ +#include +#include +#include +#include +#include // for fprintf() +#include // for close(), read() +#include // for epoll_create1(), epoll_ctl(), struct epoll_event +#include // for strncmp + +//my addition to the online guide +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define MAX_EVENTS 20000 + +int makeSocket() { + int sockfd; + if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("socket failed"); + exit(EXIT_FAILURE); + } + return sockfd; +} + +void bindSocketPort(int server_fd, int port) { + struct sockaddr_in localAddr; + localAddr.sin_family = AF_INET; + localAddr.sin_addr.s_addr = INADDR_ANY; + localAddr.sin_port = htons(port); + + if (bind(server_fd, (struct sockaddr *)&localAddr, sizeof(localAddr)) < 0) { + perror("bind failed"); + exit(EXIT_FAILURE); + } + printf("FD %d bound to port %d\n", server_fd, port); +} + +void startListening(int server_fd) { + if (listen(server_fd, 20000) < 0) { + perror("listen"); + exit(EXIT_FAILURE); + } + printf("FD %d listening to new connections\n", server_fd); +} + +int acceptConnection(int server_fd) { + int client_fd; + struct sockaddr_in remoteAddr; + + size_t addrlen = sizeof(remoteAddr); + if ((client_fd = accept(server_fd, (struct sockaddr *)&remoteAddr, (socklen_t *)&addrlen)) < 0) { + perror("accept"); + exit(EXIT_FAILURE); + } else { + int flags = fcntl(client_fd, F_GETFL); + fcntl(client_fd, F_SETFL, flags | O_NONBLOCK); + } + printf("Connection from host %s, port %d, FD %d\n", inet_ntoa(remoteAddr.sin_addr), ntohs(remoteAddr.sin_port), client_fd); + return client_fd; +} + +void acceptConnectionEpollStyle(int server_fd, int &efd) { + struct sockaddr_in new_remoteAddr; + int addrlen = sizeof(struct sockaddr_in); + + while (true) { + int conn_sock = accept(server_fd, (struct sockaddr*)&new_remoteAddr, (socklen_t*)&addrlen); + + if (conn_sock == -1) { + // All incoming connections have been processed + if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) { + break; + } else { + perror("accept"); + break; + } + } + + // make new connection non-blocking + int flags = fcntl(conn_sock, F_GETFL, 0); + fcntl(conn_sock, F_SETFL, flags | O_NONBLOCK); + + // monitor new connection for read events, always in edge triggered + struct epoll_event event; + event.events = EPOLLIN;// | EPOLLET; + event.data.fd = conn_sock; + + // Allow epoll to monitor the new connection + if (epoll_ctl(efd, EPOLL_CTL_ADD, conn_sock, &event) == -1) { + perror("epoll_ctl: conn_sock"); + break; + } + printf("Accepted epoll style connection from %s:%d from fd: %d\n", inet_ntoa(new_remoteAddr.sin_addr), ntohs(new_remoteAddr.sin_port), conn_sock); + + } +} + +void term_handler(int signal) { + printf("Terminated, received SIGNAL %d", signal); + exit(EXIT_SUCCESS); +} + + +int main(int argc, char const *argv[]) { + + signal(SIGTERM, term_handler); + + + if (argc != 2) { + printf("Usage: %s portNumber \n", argv[0]); + exit(EXIT_FAILURE); + } + int port = atoi(argv[1]); + printf("Start socket port %d\n", port); + + int master_socket; + const int opt = 1; + + + master_socket = makeSocket(); + + //set master socket to allow multiple connections , + //this is just a good habit, it will work without this + if( setsockopt(master_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, + sizeof(opt)) < 0 ) + { + perror("setsockopt"); + exit(EXIT_FAILURE); + } + + bindSocketPort(master_socket, port); + startListening(master_socket); + + int flags = fcntl(master_socket, F_GETFL, 0); + fcntl(master_socket, F_SETFL, flags | O_NONBLOCK); + + struct epoll_event ev, events[MAX_EVENTS]; + + //create the epoll instance + int epoll_fd = epoll_create1(0); + if (epoll_fd == -1) { + printf("Failed to create epoll file descriptor\n"); + exit(EXIT_FAILURE); + } + + ev.data.fd = master_socket; + // Reading events with edge triggered mode + ev.events = EPOLLIN;// | EPOLLET; + + // Allowing epoll to monitor the master_socket + if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, master_socket, &ev) == -1){ + perror("epoll_ctl"); + exit(EXIT_FAILURE); + } + + std::vector sizes; + std::vector tot_received_data; + std::vector times; + + int increment = 499; + + for (int buf_size = 1; buf_size < 1e6 + 1; ) { + switch (buf_size) { + case 500: + increment = 500; + break; + case (int) 1e3: + increment = 1e3; + break; + case (int) 5e3: + increment = 5e3; + break; + case (int) 1e4: + increment = 1e4; + break; + case (int) 5e4: + increment = 5e4; + break; + case (int) 1e5: + increment = 1e5; + break; + case (int) 5e5: + increment = 5e5; + break; + } + printf("Next increment %d with current i: %d\n", increment, buf_size); + + uint64_t bytes_read = 0; + uint64_t kBytes_read = 0; + double total_time_taken = 0; + + while (true) { + // Time measurements + auto start = std::chrono::high_resolution_clock::now(); + + // Returns only the sockets for which there are events + //printf("Before wait\n"); + int nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); + //printf("After wait\n"); + if (nfds == -1) { + perror("epoll_wait"); + exit(EXIT_FAILURE); + } + + // Iterate on the sockets having events + for (int i = 0; i < nfds; i++) { + //printf("Tot fds = %d reading from %d\n", nfds, i); + int fd = events[i].data.fd; + if (fd == master_socket) { + // If the activity is on the master socket, than it's a new connection request + acceptConnectionEpollStyle(master_socket, epoll_fd); + } else if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP) || (!(events[i].events & EPOLLIN))) { + // Than the client connection is closed, so I close it + printf("Closing %d", fd); + close(fd); + } else { + // Than we received data from one of the monitored sockets + char buffer[buf_size]; + int valread = 0; + //while (valread != EAGAIN) { + valread = recv(fd, &buffer, buf_size, 0); + if (valread > 0) { + //printf("[RICEVUTO]\t FROM %d\n", fd); + bytes_read += valread; + int kilos = 0; + if ((kilos = bytes_read / 1024) > 0) { + kBytes_read += kilos; + bytes_read -= (kilos * 1024); + //printf("reade bites %lu", bytes_read); + } + } + //} + + } + } + + auto end = std::chrono::high_resolution_clock::now(); + double time_taken = std::chrono::duration_cast(end - start).count(); + //time taken in milliseconds + time_taken *= 1e-6; + total_time_taken += time_taken; + + if (total_time_taken > 3e4) { + times.push_back(total_time_taken); + sizes.push_back(buf_size); + tot_received_data.push_back(kBytes_read); + break; + } + } + + buf_size += increment; + + } + + std::ofstream fout; + fout.open("epoll_data_stats_1000_TIMEOUT.csv"); + //the time is in milliseconds and the data in kbytes + fout << "buffer_size;time;total_received_data;\n"; + auto iter_sizes = sizes.begin(); + auto iter_times = times.begin(); + auto iter_data = tot_received_data.begin(); + + for ( ; (iter_sizes != sizes.end()) && (iter_times != times.end()) && (iter_data != tot_received_data.end()) ; (++iter_sizes, ++iter_times, ++iter_data) ) { + fout << *iter_sizes << ";" << *iter_times << ";" << *iter_data << ";\n"; + } + + fout.close(); + + if (close(epoll_fd)) { + printf("Failed to close epoll file descriptor"); + exit(EXIT_FAILURE); + } + + return 0; +} \ No newline at end of file diff --git a/testing/connection_method/event_builder_select.cxx b/testing/connection_method/event_builder_select.cxx new file mode 100644 index 0000000..b343853 --- /dev/null +++ b/testing/connection_method/event_builder_select.cxx @@ -0,0 +1,301 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + + +int makeSocket() { + int sockfd; + if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("socket failed"); + exit(EXIT_FAILURE); + } + return sockfd; +} + +void bindSocketPort(int server_fd, int port) { + struct sockaddr_in localAddr; + localAddr.sin_family = AF_INET; + localAddr.sin_addr.s_addr = INADDR_ANY; + localAddr.sin_port = htons(port); + + if (bind(server_fd, (struct sockaddr *)&localAddr, sizeof(localAddr)) < 0) { + perror("bind failed"); + exit(EXIT_FAILURE); + } + printf("FD %d bound to port %d\n", server_fd, port); +} + +void startListening(int server_fd) { + if (listen(server_fd, 1024) < 0) { + perror("listen"); + exit(EXIT_FAILURE); + } + printf("FD %d listening to new connections\n", server_fd); +} + +int acceptConnection(int server_fd) { + int client_fd; + struct sockaddr_in remoteAddr; + + size_t addrlen = sizeof(remoteAddr); + if ((client_fd = accept(server_fd, (struct sockaddr *)&remoteAddr, (socklen_t *)&addrlen)) < 0) { + perror("accept"); + exit(EXIT_FAILURE); + } else { + int flags = fcntl(client_fd, F_GETFL); + fcntl(client_fd, F_SETFL, flags | O_NONBLOCK); + } + printf("Connection from host %s, port %d, FD %d\n", inet_ntoa(remoteAddr.sin_addr), ntohs(remoteAddr.sin_port), client_fd); + return client_fd; +} + +void term_handler(int signal) { + printf("Terminated, received SIGNAL %d", signal); + exit(EXIT_SUCCESS); +} + +#define TRUE 1 +#define FALSE 0 + +int main(int argc, char const *argv[]) { + + signal(SIGTERM, term_handler); + + if (argc != 2) { + printf("Usage: %s portNumber \n", argv[0]); + exit(EXIT_FAILURE); + } + int port = atoi(argv[1]); + printf("Start socket port %d\n", port); + + int opt = TRUE; + int master_socket , addrlen , new_socket , client_socket[1024] , + max_clients = 1024 , activity, i , valread , sd; + int max_sd; + + //set of socket descriptors + fd_set readfds; + + //initialise all client_socket[] to 0 so not checked + for (i = 0; i < max_clients; i++) + { + client_socket[i] = 0; + } + + master_socket = makeSocket(); + + //set master socket to allow multiple connections , + //this is just a good habit, it will work without this + if( setsockopt(master_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, + sizeof(opt)) < 0 ) + { + perror("setsockopt"); + exit(EXIT_FAILURE); + } + + bindSocketPort(master_socket, port); + startListening(master_socket); + + int flags = fcntl(master_socket, F_GETFL, 0); + fcntl(master_socket, F_SETFL, flags | O_NONBLOCK); + + std::vector sizes; + std::vector tot_received_data; + std::vector times; + + int increment = 499; + + for (int kikko = 1; kikko < 1e6 + 1;) { + switch (kikko) { + case 500: + increment = 500; + break; + case (int) 1e3: + increment = 1e3; + break; + case (int) 5e3: + increment = 5e3; + break; + case (int) 1e4: + increment = 1e4; + break; + case (int) 5e4: + increment = 5e4; + break; + case (int) 1e5: + increment = 1e5; + break; + case (int) 5e5: + increment = 5e5; + break; + } + printf("Next increment %d with current i: %d\n", increment, kikko); + + uint64_t bytes_read = 0; + uint64_t kBytes_read = 0; + double total_time_taken = 0; + + while (true) { + auto start = std::chrono::high_resolution_clock::now(); + //clear the socket set + FD_ZERO(&readfds); + + //add master socket to set + FD_SET(master_socket, &readfds); + max_sd = master_socket; + + //add child sockets to set + for ( i = 0 ; i < max_clients ; i++) + { + //socket descriptor + sd = client_socket[i]; + + //if valid socket descriptor then add to read list + if(sd > 0) + FD_SET( sd , &readfds); + + //highest file descriptor number, need it for the select function + if(sd > max_sd) + max_sd = sd; + } + + //wait for an activity on one of the sockets , timeout is NULL , + //so wait indefinitely + activity = select( max_sd + 1 , &readfds , NULL , NULL , NULL); + + if ((activity < 0) && (errno!=EINTR)) + { + printf("select error"); + } + + //If something happened on the master socket , + //then its an incoming connection + if (FD_ISSET(master_socket, &readfds)) + { + new_socket = acceptConnection(master_socket); + + //add new socket to array of sockets + for (i = 0; i < max_clients; i++) + { + //if position is empty + if( client_socket[i] == 0 ) + { + client_socket[i] = new_socket; + printf("Adding to list of sockets as %d\n" , i); + + break; + } + } + } + + //else its some IO operation on some other socket + for (i = 0; i < max_clients; i++) + { + sd = client_socket[i]; + + if (FD_ISSET( sd , &readfds)) + { + //Check if it was for closing , and also read the + //incoming message + char buffer[kikko]; + /*if ((valread = recv( sd , &buffer, kikko, 0)) >= 0) + { + printf("[RICEVUTO]\t FROM %d valread: %d\n", sd, valread); + bytes_read += valread; + int kilos = 0; + if ((kilos = bytes_read / 1024) > 0) { + kBytes_read += kilos; + bytes_read -= (kilos * 1024); + //printf("reade bites %lu", bytes_read); + } + }*/ + + if ((valread = recv( sd , &buffer, kikko, 0)) == 0) + { + struct sockaddr_in address; + int addrlen; + //Somebody disconnected , get his details and print + getpeername(sd , (struct sockaddr*)&address , \ + (socklen_t*)&addrlen); + printf("Host disconnected , ip %s , port %d \n" , + inet_ntoa(address.sin_addr) , ntohs(address.sin_port)); + + printf("Disconnected fd %d", sd); + + //Close the socket and mark as 0 in list for reuse + close( sd ); + client_socket[i] = 0; + } + + //Echo back the message that came in + else + { + if (valread > 0) { + //printf("[RICEVUTO]\t FROM %d\n", sd); + bytes_read += valread; + int kilos = 0; + if ((kilos = bytes_read / 1024) > 0) { + kBytes_read += kilos; + bytes_read -= (kilos * 1024); + //printf("reade bites %lu", bytes_read); + } + } + } + } + } + + auto end = std::chrono::high_resolution_clock::now(); + double time_taken = std::chrono::duration_cast(end - start).count(); + //time taken in milliseconds + time_taken *= 1e-6; + total_time_taken += time_taken; + + if (total_time_taken > 3e4) { + times.push_back(total_time_taken); + sizes.push_back(kikko); + tot_received_data.push_back(kBytes_read); + break; + } + + //sleep(3); + + + } + + kikko += increment; + + } + + std::ofstream fout; + fout.open("select_data_stats_1000desc_NOBLOCK_TIMEOUT_HARD.csv"); + //the time is in milliseconds and the data in kbytes + fout << "buffer_size;time;total_received_data;\n"; + auto iter_sizes = sizes.begin(); + auto iter_times = times.begin(); + auto iter_data = tot_received_data.begin(); + + for ( ; (iter_sizes != sizes.end()) && (iter_times != times.end()) && (iter_data != tot_received_data.end()) ; (++iter_sizes, ++iter_times, ++iter_data) ) { + fout << *iter_sizes << ";" << *iter_times << ";" << *iter_data << ";\n"; + } + + fout.close(); + + + + return 0; +} \ No newline at end of file diff --git a/testing/connection_method/fragment_dataformat.h b/testing/connection_method/fragment_dataformat.h new file mode 100644 index 0000000..cbecd89 --- /dev/null +++ b/testing/connection_method/fragment_dataformat.h @@ -0,0 +1,56 @@ +#include +#include +#include + +#define START_OF_HEADER_MARKER 0xee1234ee + +typedef struct Header { + uint32_t startOfHeaderMarker = START_OF_HEADER_MARKER; + uint32_t headerSize; + uint32_t fragmentSize; + uint32_t sourceIdentifier; + uint32_t runNumber; + uint32_t detectorEventNumber; + uint32_t numberOfStatusElements; + uint32_t *statusElementsArray; + /*friend std::ostream& operator <<(std::ostream& os, Header const& header) + { + return os << std::setw(8) << std::setfill('0') << header.startOfHeaderMarker << '\n' + << std::setw(8) << std::setfill('0') << header.headerSize << '\n' + << std::setw(8) << std::setfill('0') << header.fragmentSize << '\n' + << std::setw(8) << std::setfill('0') << header.runNumber << '\n' + << std::setw(8) << std::setfill('0') << header.detectorEventNumber << '\n' + << std::setw(8) << std::setfill('0') << header.numberOfStatusElements << '\n'; + }*/ +} Header; + +typedef struct Fragment { + Header header; + uint32_t *payloadElements; +} Fragment; + +enum ERROR_CODES { + INCORRECT_ERROR = (1 << 0), + CORRUPTED_ERROR = (1 << 1), + MISSING_DATA_ERROR = (1 << 2), + TIMEOUT_ERROR = (1 << 3) +}; + +void encode_header(uint32_t *buffer, const Header &header) { + buffer[0] = header.startOfHeaderMarker; + buffer[1] = header.headerSize; + buffer[2] = header.fragmentSize; + buffer[3] = header.sourceIdentifier; + buffer[4] = header.runNumber; + buffer[5] = header.detectorEventNumber; + buffer[6] = header.numberOfStatusElements; + + std::memcpy(&buffer[7], header.statusElementsArray, header.numberOfStatusElements * sizeof(uint32_t)); +} + +void encode_fragment(uint32_t *buffer, const Fragment &fragment){ + encode_header(buffer, fragment.header); + std::memcpy(&buffer[fragment.header.headerSize], fragment.payloadElements, (fragment.header.fragmentSize - fragment.header.headerSize) * sizeof(uint32_t)); +} + + diff --git a/testing/connection_method/notes_on_connection_method.md b/testing/connection_method/notes_on_connection_method.md new file mode 100644 index 0000000..6dd19c6 --- /dev/null +++ b/testing/connection_method/notes_on_connection_method.md @@ -0,0 +1,46 @@ +# Important notes on why to use level triggered mode in this scenario +For monitoring multiple clients sending data frequently, you should generally use level-triggered mode with epoll() for simplicity and reliability. + +Level-Triggered Mode: In this mode, the epoll_wait() function returns whenever there is data available to read or write on a socket, as long as the socket remains ready. You use recv() or send() to read or write the data. This mode is more suitable for handling frequent data transmission, as the socket remains in the ready state until all available data is processed. + +Edge-Triggered Mode: In this mode, the epoll_wait() function returns only when the socket transitions from not ready to ready. You need to process data until EAGAIN is received, at which point you should exit the loop and re-register the socket with EPOLLONESHOT to be notified again when the socket becomes ready again. This mode requires more careful management, as you must handle the data until no more is available, and it can lead to more complex code. + +Given your description of continuous data transmission causing the application to hang in edge-triggered mode, and considering your preference for handling frequent data transmission, level-triggered mode seems like the better choice. It allows you to focus on processing data without worrying about handling the edge conditions and re-registering the socket. + +From a theoretical standpoint: + +Edge Triggered: This mode provides more fine-grained control and can potentially be more efficient, especially in scenarios where data arrival might be infrequent and you want to be notified only when there's a change in socket readiness. + +Level Triggered: This mode simplifies handling continuous data flow, as the socket remains in the ready state as long as data is available, which is often more suitable for high-frequency data streams. + +Ultimately, your choice should depend on the nature of your application and how you want to manage the data flow. While edge-triggered mode can be used with careful handling, level-triggered mode is generally simpler and more straightforward for frequent data transmission scenarios. + + + +Exactly, you've got it right! In scenarios where you need to read and buffer all available data for later processing, level-triggered mode is the better choice. It ensures that you'll be continuously notified as long as there's data available to read, allowing you to consume and buffer the data without worrying about missing any part of it. + +Level-triggered mode is particularly well-suited for scenarios where you want to handle data consumption and processing at your own pace, as the socket remains in the ready state as long as data is available, ensuring that you have the opportunity to read all available data before continuing with other tasks. + +So, for your specific use case of reading all the data available and buffering it for later use, level-triggered mode with epoll() is a solid choice. + +Yes, your approach of using one thread for epoll-based socket monitoring and another thread for data analysis using thread-safe queues is a valid and common way to handle this kind of scenario. Here's a high-level overview of how your setup would work: + +Epoll Thread: This thread will use epoll() with level-triggered mode to monitor multiple sockets for incoming data. Whenever data is available to read on a socket, the epoll thread can read the data and enqueue it into the thread-safe queue. + +Data Analysis Thread: This thread will be responsible for dequeuing the buffered data from the thread-safe queue and performing the necessary analysis on it. Since the queue is thread-safe, you won't have to worry about synchronization issues between the two threads. + +This separation of concerns allows you to isolate the low-level socket I/O and buffering logic from the data analysis logic, making your application more modular and maintainable. + +Keep in mind a few considerations: + +Concurrency: While using multiple threads can improve parallelism, it also introduces complexity. Ensure that you handle thread synchronization and communication properly to avoid race conditions or deadlocks. + +Resource Management: Manage your data buffers carefully to avoid excessive memory consumption, especially if data arrives rapidly. Consider setting limits on the size of your buffers and implementing buffer recycling mechanisms if needed. + +Thread Safety: Make sure the data analysis thread doesn't access or modify the same data buffers that the epoll thread is using. This is where your thread-safe queue comes in handy, as it provides a clean boundary between the two threads. + +Error Handling: Implement robust error handling mechanisms to gracefully handle unexpected situations, such as socket errors or issues with the thread-safe queue. + +Overall, your proposed approach seems reasonable and can be an effective way to achieve your goal of efficiently buffering data for later analysis while utilizing multi-threading for improved performance. + + diff --git a/testing/connection_method/prov.out b/testing/connection_method/prov.out new file mode 100755 index 0000000000000000000000000000000000000000..026f9b264ae4ef1dfa95d75a641add2a8d5fe2be GIT binary patch literal 17752 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 EpL{?Aw*UYD literal 0 HcmV?d00001 diff --git a/testing/connection_method/provider.cxx b/testing/connection_method/provider.cxx new file mode 100644 index 0000000..fd08e57 --- /dev/null +++ b/testing/connection_method/provider.cxx @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +int makeSocket() { + int sockfd; + if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("socket failed"); + exit(EXIT_FAILURE); + } + return sockfd; +} + +void connectTo(int sock, const char* host, int port) { + struct sockaddr_in serv_addr; + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = inet_addr(host); + serv_addr.sin_port = htons(port); + + if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { + perror("Connection failed"); + exit(EXIT_FAILURE); + } + + printf("Connected to %s: %d\n", host, port); +} + +int main(int argc, char* argv[]) { + + if (argc != 2) { + printf("Usage: ./prov.out timeout (ms)"); + exit(EXIT_FAILURE); + } + + int timeout = atoi(argv[1]); + //printf("Selected timeout: %f", static_cast(timeout) / 1000); + + int socket = makeSocket(); + connectTo(socket, "127.0.0.1", 7777); + + //allocating 100 megabytes of memory + uint64_t* chunky_boy = new uint64_t[67108]; + size_t chunky_boy_size = 67108 * sizeof(uint64_t); + printf("chonky size %d", static_cast(chunky_boy_size)); + + //setting memory to verify non-emptyness + memset(chunky_boy, 45678, chunky_boy_size); + + int buffer_size = 1024 * 32; + + + for ( ;;) { + + for ( int j = 0; j < chunky_boy_size; ) { + + ssize_t bytes = send(socket, reinterpret_cast(chunky_boy) + j, std::min(static_cast(chunky_boy_size) - j, buffer_size), 0); + if (timeout != 0) { + sleep(static_cast(timeout) / 1000); + } + j += buffer_size; + } + + } + + + return 0; +} \ No newline at end of file diff --git a/testing/connection_method/readme.txt b/testing/connection_method/readme.txt new file mode 100644 index 0000000..be42d79 --- /dev/null +++ b/testing/connection_method/readme.txt @@ -0,0 +1,17 @@ +this test wants to see how much data is possible to gather in 60 seconds with select and epoll. +For that reason, I'm removing the random time between provider data generation and send it asap. +I'll spawn 50 clients and let them connect and send data as fast as they can while I measure total received data on server side. +I'm ignoring all bottlenecks for now. All tests of this section are brought out on my local machine. + +EDIT: by default all clients allocate a massive 100 megabytes of space to send big chunks of data. +To test with a bigger number of descriptors (I'm making 100, 500, 1000, 5000, 10000) i'm lowering the chunk size as well as changing +the generation method of the data to send. +So trashing first result with 50 and re executing with all the different clien numbers. + + +since no big performance difference (as expected, since with all clients active also epoll has to iterate through everything since it gets notified from all), +retesting with timeout on majority of clients. files with *_TIMEOUT.csv have only 50 clients without timeout, files with *TIMEOUT_HARD.csv have only 2 clients. +The timeout is pretty hard, we're talking 1 second, to hilight the difference in performance. +With epoll we see a big rise in throughput with the 2 clients, since we kill cpu time for iteration and optimize the 30 seconds time analysis, +in the 50 clients it's not so evident. With 50 we start to see already big improvements with epoll vs select. + diff --git a/testing/connection_method/select_data_stats_1000desc_NOBLOCK_TIMEOUT.csv b/testing/connection_method/select_data_stats_1000desc_NOBLOCK_TIMEOUT.csv new file mode 100644 index 0000000..687919d --- /dev/null +++ b/testing/connection_method/select_data_stats_1000desc_NOBLOCK_TIMEOUT.csv @@ -0,0 +1,19 @@ +buffer_size;time;total_received_data; +1;30001;31734; +500;30000.3;5573836; +1000;30000;8694627; +2000;30000.1;14935890; +3000;30000.1;21792013; +4000;30000.1;24816724; +5000;30000.1;28805466; +10000;30000;46161885; +20000;30000.6;61985281; +30000;30000.9;60864280; +40000;30000.6;70116721; +50000;30000.4;79858909; +100000;30001.1;77035845; +200000;30001.2;98608909; +300000;30001.6;111016135; +400000;30002.2;109526878; +500000;30005.3;129750689; +1000000;30005;101069846; diff --git a/testing/connection_method/select_data_stats_1000desc_NOBLOCK_TIMEOUT_HARD.csv b/testing/connection_method/select_data_stats_1000desc_NOBLOCK_TIMEOUT_HARD.csv new file mode 100644 index 0000000..5ec6e0c --- /dev/null +++ b/testing/connection_method/select_data_stats_1000desc_NOBLOCK_TIMEOUT_HARD.csv @@ -0,0 +1,19 @@ +buffer_size;time;total_received_data; +1;30000.1;30805; +500;30000;1887572; +1000;30000;1390681; +2000;30000;1886540; +3000;30000;2337091; +4000;30000;2781395; +5000;30000;3236316; +10000;30000.1;5596495; +20000;30000;9857822; +30000;30000;13786084; +40000;30000.2;15183408; +50000;30000.5;16604221; +100000;30000.1;25196651; +200000;30000.2;44064204; +300000;30000;47852732; +400000;30000.4;51052155; +500000;30000.6;50078987; +1000000;30000.3;70992968; diff --git a/testing/connection_method/spawn_clients.sh b/testing/connection_method/spawn_clients.sh new file mode 100755 index 0000000..764566d --- /dev/null +++ b/testing/connection_method/spawn_clients.sh @@ -0,0 +1,15 @@ +#!/bin/bash +echo "Usage: $0 host port runNumber numberOfProviders" +if [ $# -eq 1 ] +then + for i in $(seq 1 $1); + do + echo "Spawning provider number $i" + if [ $i -le 2 ] + then + ./prov.out 0& + else + ./prov.out 1000& + fi + done +fi diff --git a/testing/results/select_data_stats.csv b/testing/results/select_data_stats.csv new file mode 100644 index 0000000..87929f3 --- /dev/null +++ b/testing/results/select_data_stats.csv @@ -0,0 +1,19 @@ +buffer_size;time;total_received_data; +500;30000;923066; +500;30000;1246851; +500;30000;1224399; +500;30000;1236942; +500;30000;1237006; +500;30000;1240083; +500;30000;1243543; +500;30000;1247446; +500;30000;1249498; +500;30000;1242588; +500;30000;1246731; +500;30000;1249731; +500;30000;1245551; +500;30000;1251264; +500;30000;1257202; +500;30000;1253106; +500;30000;1250601; +500;30000;1249947; diff --git a/testing/results/select_data_stats_1000desc_NOBLOCK.csv b/testing/results/select_data_stats_1000desc_NOBLOCK.csv new file mode 100644 index 0000000..95a44e7 --- /dev/null +++ b/testing/results/select_data_stats_1000desc_NOBLOCK.csv @@ -0,0 +1,19 @@ +buffer_size;time;total_received_data; +1;30000.5;30019; +500;30000.3;12629492; +1000;30003.2;20228484; +2000;30000.9;31157526; +3000;30000.5;38823216; +4000;30000.6;44107121; +5000;30000;45085442; +10000;30000.1;60564704; +20000;30001.2;72663492; +30000;30005.5;72002012; +40000;30000.2;77138855; +50000;30001.6;88049703; +100000;30005.6;101391654; +200000;30001.9;99283463; +300000;30014.1;91602483; +400000;30004.2;113396854; +500000;30008.1;112980666; +1000000;30015.8;105931378; diff --git a/testing/results/select_data_stats_100desc.csv b/testing/results/select_data_stats_100desc.csv new file mode 100644 index 0000000..ca62d71 --- /dev/null +++ b/testing/results/select_data_stats_100desc.csv @@ -0,0 +1,19 @@ +buffer_size;time;total_received_data; +1;30000;42850; +500;30000.1;15883661; +1000;30000;27186324; +2000;30000.2;41545982; +3000;30000.4;47881778; +4000;30004.2;54284932; +5000;30006.1;55478462; +10000;30000.1;95230218; +20000;30000.2;105701171; +30000;30000;103435546; +40000;30000.9;114492187; +50000;30000.7;112895507; +100000;30001;113681640; +200000;30000.6;113457031; +300000;30002.4;128701171; +400000;30002.3;129140625; +500000;30014.2;133642578; +1000000;30022;124511718; diff --git a/testing/results/select_data_stats_100desc_NOBLOCK.csv b/testing/results/select_data_stats_100desc_NOBLOCK.csv new file mode 100644 index 0000000..2338196 --- /dev/null +++ b/testing/results/select_data_stats_100desc_NOBLOCK.csv @@ -0,0 +1,19 @@ +buffer_size;time;total_received_data; +1;30000;39454; +500;30000.1;16157269; +1000;30000;27153432; +2000;30000.1;40100085; +3000;30000;48828124; +4000;30000.1;55680401; +5000;30000;61979270; +10000;30000.3;98380003; +20000;30000.1;106611328; +30000;30000.7;107302734; +40000;30000.2;101027343; +50000;30000;111542968; +100000;30001;102851562; +200000;30004.2;118359375; +300000;30003;122314453; +400000;30008.9;118750000; +500000;30009.5;118750000; +1000000;30020.8;117871093; diff --git a/testing/results/select_data_stats_500desc_NOBLOCK.csv b/testing/results/select_data_stats_500desc_NOBLOCK.csv new file mode 100644 index 0000000..c1af4f9 --- /dev/null +++ b/testing/results/select_data_stats_500desc_NOBLOCK.csv @@ -0,0 +1,19 @@ +buffer_size;time;total_received_data; +1;30000.2;31884; +500;30000.2;14397128; +1000;30000.4;23282151; +2000;30001;34224109; +3000;30000.5;42075605; +4000;30000;47592080; +5000;30000.5;50634489; +10000;30002.2;62469144; +20000;30013.4;65980444; +30000;30003.8;66720000; +40000;30005.9;74623936; +50000;30001.5;103636705; +100000;30002.9;111512675; +200000;30002.2;107186640; +300000;30013.8;111613113; +400000;30005.9;105724495; +500000;30008.1;106815424; +1000000;30037.6;108984396; diff --git a/testing/results/send_data_buffer.csv b/testing/results/send_data_buffer.csv new file mode 100644 index 0000000..02e6f9d --- /dev/null +++ b/testing/results/send_data_buffer.csv @@ -0,0 +1,1002 @@ +buffer_size;time; +1;87.9309; +1001;0.0893674; +2001;0.0592124; +3001;0.0485199; +4001;0.0492849; +5001;0.0398494; +6001;0.0364237; +7001;0.0358461; +8001;0.0383608; +9001;0.0338195; +10001;0.0324978; +11001;0.029857; +12001;0.0303058; +13001;0.0287335; +14001;0.0286668; +15001;0.0286333; +16001;0.0289975; +17001;0.0291874; +18001;0.0269786; +19001;0.0272858; +20001;0.0272955; +21001;0.0275356; +22001;0.0271853; +23001;0.0270467; +24001;0.0262923; +25001;0.0263059; +26001;0.0263216; +27001;0.0269245; +28001;0.026347; +29001;0.0262578; +30001;0.0256281; +31001;0.025248; +32001;0.0255907; +33001;0.0261745; +34001;0.0262026; +35001;0.0256409; +36001;0.0256219; +37001;0.0254912; +38001;0.026476; +39001;0.0262793; +40001;0.0251087; +41001;0.0246027; +42001;0.0257793; +43001;0.0248307; +44001;0.0309805; +45001;0.0303154; +46001;0.0254046; +47001;0.0248051; +48001;0.024884; +49001;0.0246509; +50001;0.0244738; +51001;0.0243873; +52001;0.0244064; +53001;0.024351; +54001;0.0241724; +55001;0.0240383; +56001;0.0240368; +57001;0.0241954; +58001;0.0246477; +59001;0.024407; +60001;0.0242947; +61001;0.024056; +62001;0.0250822; +63001;0.0240311; +64001;0.023674; +65001;0.0238547; +66001;0.0271549; +67001;0.0270472; +68001;0.027; +69001;0.0265107; +70001;0.0259204; +71001;0.0261101; +72001;0.0256541; +73001;0.0257699; +74001;0.0256938; +75001;0.0258904; +76001;0.0252955; +77001;0.025538; +78001;0.0249363; +79001;0.0261412; +80001;0.0250837; +81001;0.0247154; +82001;0.0245536; +83001;0.0243707; +84001;0.0318549; +85001;0.0264316; +86001;0.0250751; +87001;0.0242768; +88001;0.0243975; +89001;0.0240656; +90001;0.0239768; +91001;0.0240867; +92001;0.0242316; +93001;0.0240912; +94001;0.0242191; +95001;0.0241983; +96001;0.0244142; +97001;0.0241494; +98001;0.0239877; +99001;0.0249698; +100001;0.0250142; +101001;0.0243209; +102001;0.0241806; +103001;0.0237266; +104001;0.0249876; +105001;0.0240472; +106001;0.0243643; +107001;0.0238247; +108001;0.0239828; +109001;0.0240386; +110001;0.0242905; +111001;0.0241815; +112001;0.0237832; +113001;0.02404; +114001;0.0237891; +115001;0.0237028; +116001;0.0236344; +117001;0.0235514; +118001;0.0238168; +119001;0.0238106; +120001;0.0240809; +121001;0.0235752; +122001;0.0246327; +123001;0.024358; +124001;0.0239013; +125001;0.0282321; +126001;0.0240895; +127001;0.0256373; +128001;0.0243128; +129001;0.0234303; +130001;0.0235624; +131001;0.0241904; +132001;0.0245538; +133001;0.0242756; +134001;0.0242547; +135001;0.0248935; +136001;0.0247011; +137001;0.0241096; +138001;0.0240715; +139001;0.02397; +140001;0.0241387; +141001;0.0241085; +142001;0.0239715; +143001;0.025522; +144001;0.0245956; +145001;0.0241071; +146001;0.0238712; +147001;0.0245934; +148001;0.024231; +149001;0.0240329; +150001;0.0236885; +151001;0.0236899; +152001;0.0243104; +153001;0.0236414; +154001;0.0235434; +155001;0.0233067; +156001;0.0233362; +157001;0.0232659; +158001;0.0241406; +159001;0.0243417; +160001;0.0237077; +161001;0.0237777; +162001;0.0231811; +163001;0.023275; +164001;0.0233076; +165001;0.0270223; +166001;0.0317444; +167001;0.0300444; +168001;0.0298339; +169001;0.023872; +170001;0.0230265; +171001;0.0230668; +172001;0.0230516; +173001;0.0231017; +174001;0.0229901; +175001;0.0230306; +176001;0.02326; +177001;0.0236495; +178001;0.0226623; +179001;0.0229562; +180001;0.022766; +181001;0.0231187; +182001;0.0230433; +183001;0.0229115; +184001;0.0231073; +185001;0.0238701; +186001;0.0232845; +187001;0.0228816; +188001;0.0225595; +189001;0.0226804; +190001;0.0229255; +191001;0.0229101; +192001;0.0223701; +193001;0.0228701; +194001;0.0226946; +195001;0.0224592; +196001;0.0222653; +197001;0.0231463; +198001;0.0231337; +199001;0.0229255; +200001;0.0230521; +201001;0.0238793; +202001;0.0234556; +203001;0.0234274; +204001;0.0230482; +205001;0.0230609; +206001;0.0228007; +207001;0.0227871; +208001;0.0269512; +209001;0.0240393; +210001;0.0232556; +211001;0.0266479; +212001;0.0223081; +213001;0.0230049; +214001;0.0231418; +215001;0.0228633; +216001;0.0225202; +217001;0.022462; +218001;0.0227582; +219001;0.0236866; +220001;0.0231628; +221001;0.022768; +222001;0.0231355; +223001;0.0226859; +224001;0.0228791; +225001;0.0234715; +226001;0.0234475; +227001;0.0232228; +228001;0.0242492; +229001;0.0233657; +230001;0.0227931; +231001;0.0237369; +232001;0.0230075; +233001;0.0231535; +234001;0.0228516; +235001;0.0231846; +236001;0.0235808; +237001;0.0239794; +238001;0.0236266; +239001;0.0232983; +240001;0.0233774; +241001;0.0231651; +242001;0.0234513; +243001;0.0233445; +244001;0.0233017; +245001;0.0228586; +246001;0.0226534; +247001;0.0226128; +248001;0.0233934; +249001;0.023235; +250001;0.0240644; +251001;0.0310484; +252001;0.0230793; +253001;0.0231978; +254001;0.0225346; +255001;0.023456; +256001;0.0226809; +257001;0.0224949; +258001;0.0227302; +259001;0.0224099; +260001;0.0225742; +261001;0.0229879; +262001;0.0232294; +263001;0.0233269; +264001;0.0239077; +265001;0.0235496; +266001;0.0242001; +267001;0.0252571; +268001;0.0266083; +269001;0.0230584; +270001;0.0259026; +271001;0.0257846; +272001;0.0245431; +273001;0.0227111; +274001;0.0246467; +275001;0.0227772; +276001;0.022862; +277001;0.0224269; +278001;0.0224901; +279001;0.0225755; +280001;0.0225846; +281001;0.0227186; +282001;0.0224944; +283001;0.0225041; +284001;0.0227023; +285001;0.0225314; +286001;0.0228119; +287001;0.022768; +288001;0.0225812; +289001;0.022822; +290001;0.0223749; +291001;0.0226552; +292001;0.0228328; +293001;0.0225794; +294001;0.0336717; +295001;0.0240288; +296001;0.0228341; +297001;0.0237947; +298001;0.0225131; +299001;0.0230957; +300001;0.0225206; +301001;0.0224365; +302001;0.0225773; +303001;0.0226307; +304001;0.0227357; +305001;0.0223265; +306001;0.0228554; +307001;0.0225295; +308001;0.0225225; +309001;0.0228681; +310001;0.022989; +311001;0.0224278; +312001;0.0221478; +313001;0.0229368; +314001;0.023322; +315001;0.0227348; +316001;0.0232047; +317001;0.0227944; +318001;0.0227249; +319001;0.0225221; +320001;0.0231017; +321001;0.0220686; +322001;0.0222504; +323001;0.0226075; +324001;0.0222205; +325001;0.0226022; +326001;0.0224075; +327001;0.022525; +328001;0.0229188; +329001;0.0230906; +330001;0.0228088; +331001;0.0227268; +332001;0.0223918; +333001;0.0222266; +334001;0.0225657; +335001;0.0221627; +336001;0.0225003; +337001;0.0274659; +338001;0.026358; +339001;0.0231524; +340001;0.0229482; +341001;0.0224009; +342001;0.0230508; +343001;0.0227174; +344001;0.0227713; +345001;0.0226705; +346001;0.0228278; +347001;0.0227144; +348001;0.0225916; +349001;0.022924; +350001;0.0224489; +351001;0.022639; +352001;0.0229176; +353001;0.0226594; +354001;0.0224836; +355001;0.023016; +356001;0.0229625; +357001;0.0226725; +358001;0.0226642; +359001;0.0280504; +360001;0.0225366; +361001;0.0228499; +362001;0.0226178; +363001;0.0225407; +364001;0.0227772; +365001;0.022831; +366001;0.022725; +367001;0.0231848; +368001;0.0227016; +369001;0.0227749; +370001;0.0229231; +371001;0.022822; +372001;0.0227222; +373001;0.0231706; +374001;0.0227175; +375001;0.0227662; +376001;0.0221507; +377001;0.0224125; +378001;0.0225799; +379001;0.0228059; +380001;0.0235026; +381001;0.0255627; +382001;0.0227134; +383001;0.0232084; +384001;0.0226941; +385001;0.0221407; +386001;0.0223515; +387001;0.0219755; +388001;0.0220367; +389001;0.0220471; +390001;0.02206; +391001;0.0221862; +392001;0.0226857; +393001;0.0233221; +394001;0.0227577; +395001;0.0227514; +396001;0.0224452; +397001;0.0227495; +398001;0.0226097; +399001;0.0225138; +400001;0.0226469; +401001;0.0230569; +402001;0.0230445; +403001;0.0227406; +404001;0.0225299; +405001;0.0225647; +406001;0.0226751; +407001;0.0224497; +408001;0.0226778; +409001;0.0231452; +410001;0.0232906; +411001;0.0226691; +412001;0.0224087; +413001;0.0222702; +414001;0.0223742; +415001;0.0223759; +416001;0.0223235; +417001;0.0238031; +418001;0.0227239; +419001;0.0230108; +420001;0.0223778; +421001;0.0224506; +422001;0.0229636; +423001;0.022453; +424001;0.0247029; +425001;0.0266976; +426001;0.022425; +427001;0.0229008; +428001;0.0235711; +429001;0.0226269; +430001;0.0229804; +431001;0.0224728; +432001;0.0231492; +433001;0.0226238; +434001;0.0229454; +435001;0.0241565; +436001;0.0224319; +437001;0.0223036; +438001;0.022129; +439001;0.0220859; +440001;0.0224576; +441001;0.0227831; +442001;0.0226095; +443001;0.0227178; +444001;0.0231957; +445001;0.0231646; +446001;0.0227077; +447001;0.0225751; +448001;0.0223295; +449001;0.0229455; +450001;0.0228923; +451001;0.0221001; +452001;0.0226955; +453001;0.022723; +454001;0.0230543; +455001;0.0223779; +456001;0.0223631; +457001;0.0224204; +458001;0.0221805; +459001;0.022366; +460001;0.0227756; +461001;0.0235864; +462001;0.0228129; +463001;0.0234018; +464001;0.0231589; +465001;0.0233169; +466001;0.0300256; +467001;0.0297606; +468001;0.0324181; +469001;0.0268155; +470001;0.0222947; +471001;0.0231378; +472001;0.0224023; +473001;0.0231357; +474001;0.0231769; +475001;0.0223527; +476001;0.0224051; +477001;0.0241708; +478001;0.0227043; +479001;0.0225136; +480001;0.0223518; +481001;0.0230181; +482001;0.0223465; +483001;0.0223663; +484001;0.022445; +485001;0.0225387; +486001;0.0224345; +487001;0.0222781; +488001;0.0225332; +489001;0.0224554; +490001;0.02259; +491001;0.0223899; +492001;0.0228556; +493001;0.0220565; +494001;0.0226053; +495001;0.022933; +496001;0.0228009; +497001;0.0229762; +498001;0.023217; +499001;0.0223987; +500001;0.0226558; +501001;0.0228521; +502001;0.0225329; +503001;0.0229601; +504001;0.0226378; +505001;0.0225173; +506001;0.0223298; +507001;0.0221176; +508001;0.0228906; +509001;0.0221277; +510001;0.0223585; +511001;0.0285635; +512001;0.0232667; +513001;0.0227028; +514001;0.0225205; +515001;0.022351; +516001;0.0227781; +517001;0.0228956; +518001;0.0221618; +519001;0.0227025; +520001;0.0225109; +521001;0.0226041; +522001;0.0224779; +523001;0.0229535; +524001;0.0231055; +525001;0.0231023; +526001;0.0230971; +527001;0.0227653; +528001;0.0225899; +529001;0.0228139; +530001;0.0225741; +531001;0.0225675; +532001;0.0224928; +533001;0.0228587; +534001;0.0235146; +535001;0.022638; +536001;0.0225505; +537001;0.02272; +538001;0.0230663; +539001;0.0221058; +540001;0.0226197; +541001;0.0222531; +542001;0.0224409; +543001;0.0221372; +544001;0.0220763; +545001;0.0219029; +546001;0.0218145; +547001;0.0230213; +548001;0.0223103; +549001;0.022924; +550001;0.0227968; +551001;0.0225934; +552001;0.0232563; +553001;0.0225338; +554001;0.0224367; +555001;0.0353894; +556001;0.0283072; +557001;0.0226526; +558001;0.0223418; +559001;0.0223055; +560001;0.0222988; +561001;0.0224108; +562001;0.0222341; +563001;0.0224038; +564001;0.022094; +565001;0.0224535; +566001;0.0229574; +567001;0.0224166; +568001;0.0222865; +569001;0.0226506; +570001;0.0228621; +571001;0.0226119; +572001;0.0225331; +573001;0.0228573; +574001;0.0226151; +575001;0.022173; +576001;0.0220541; +577001;0.0221678; +578001;0.0225851; +579001;0.0234255; +580001;0.0222539; +581001;0.0225564; +582001;0.0230003; +583001;0.0226046; +584001;0.0222902; +585001;0.0219483; +586001;0.0223866; +587001;0.0223483; +588001;0.0221648; +589001;0.0224664; +590001;0.022354; +591001;0.0224962; +592001;0.0229969; +593001;0.0227603; +594001;0.0226076; +595001;0.022746; +596001;0.022914; +597001;0.0227682; +598001;0.0263089; +599001;0.0384467; +600001;0.0452436; +601001;0.03369; +602001;0.0265427; +603001;0.0224858; +604001;0.0224858; +605001;0.0222874; +606001;0.022456; +607001;0.0227506; +608001;0.0226439; +609001;0.0229784; +610001;0.0225925; +611001;0.0225326; +612001;0.0226349; +613001;0.0222811; +614001;0.0233497; +615001;0.0224987; +616001;0.0222687; +617001;0.022276; +618001;0.0224251; +619001;0.0223269; +620001;0.022315; +621001;0.0221377; +622001;0.0225193; +623001;0.0230752; +624001;0.0222825; +625001;0.0228613; +626001;0.0232574; +627001;0.022166; +628001;0.0222827; +629001;0.0222186; +630001;0.022567; +631001;0.0223198; +632001;0.0225445; +633001;0.0225993; +634001;0.0222097; +635001;0.0226038; +636001;0.0223565; +637001;0.022456; +638001;0.0221313; +639001;0.0225177; +640001;0.0270195; +641001;0.0304029; +642001;0.0257649; +643001;0.0241; +644001;0.0228717; +645001;0.0236946; +646001;0.0231014; +647001;0.0222795; +648001;0.0221882; +649001;0.0222607; +650001;0.0230042; +651001;0.0225098; +652001;0.0223156; +653001;0.0222486; +654001;0.0222203; +655001;0.0224661; +656001;0.0224029; +657001;0.0224112; +658001;0.0224432; +659001;0.0222946; +660001;0.0220242; +661001;0.0220141; +662001;0.0220229; +663001;0.0236717; +664001;0.022496; +665001;0.0224295; +666001;0.0223816; +667001;0.0222687; +668001;0.0224665; +669001;0.0221735; +670001;0.0225723; +671001;0.0222699; +672001;0.0223011; +673001;0.0222041; +674001;0.0223319; +675001;0.0222887; +676001;0.0224369; +677001;0.0224938; +678001;0.0228104; +679001;0.0229449; +680001;0.0227725; +681001;0.022588; +682001;0.0218226; +683001;0.0223417; +684001;0.0278192; +685001;0.0223689; +686001;0.0231111; +687001;0.0221952; +688001;0.0219974; +689001;0.0224429; +690001;0.022043; +691001;0.0223436; +692001;0.0226612; +693001;0.0332736; +694001;0.0344241; +695001;0.0281001; +696001;0.0475276; +697001;0.0308036; +698001;0.0290694; +699001;0.0303032; +700001;0.0251934; +701001;0.0227253; +702001;0.0225041; +703001;0.0227503; +704001;0.022342; +705001;0.0222145; +706001;0.0227158; +707001;0.0221233; +708001;0.0221964; +709001;0.0227296; +710001;0.0225054; +711001;0.0226487; +712001;0.0222905; +713001;0.0220439; +714001;0.0221234; +715001;0.022467; +716001;0.0222865; +717001;0.0224083; +718001;0.0218199; +719001;0.0222023; +720001;0.0221602; +721001;0.0221426; +722001;0.0222971; +723001;0.0220251; +724001;0.0221756; +725001;0.0285089; +726001;0.0225117; +727001;0.022425; +728001;0.0222723; +729001;0.0224023; +730001;0.0220781; +731001;0.0231521; +732001;0.0224913; +733001;0.0225258; +734001;0.022069; +735001;0.0230937; +736001;0.0281795; +737001;0.0227507; +738001;0.022381; +739001;0.0225612; +740001;0.0225574; +741001;0.0223113; +742001;0.0221363; +743001;0.0221314; +744001;0.022263; +745001;0.0225503; +746001;0.0226254; +747001;0.0222772; +748001;0.0225618; +749001;0.0227657; +750001;0.0224613; +751001;0.0222523; +752001;0.0218394; +753001;0.0222981; +754001;0.0217209; +755001;0.0229854; +756001;0.0222012; +757001;0.0224878; +758001;0.0224772; +759001;0.0222272; +760001;0.0218207; +761001;0.0232462; +762001;0.0227002; +763001;0.0219143; +764001;0.0225294; +765001;0.0226706; +766001;0.0225198; +767001;0.02266; +768001;0.0229902; +769001;0.0282163; +770001;0.0228647; +771001;0.0235029; +772001;0.022955; +773001;0.0223613; +774001;0.0227221; +775001;0.0224679; +776001;0.0225225; +777001;0.0226193; +778001;0.0224712; +779001;0.0228175; +780001;0.0227752; +781001;0.0229278; +782001;0.0223948; +783001;0.0227701; +784001;0.0221642; +785001;0.0225209; +786001;0.0227461; +787001;0.0226259; +788001;0.0226667; +789001;0.023102; +790001;0.0229719; +791001;0.0228435; +792001;0.0233381; +793001;0.0231936; +794001;0.0227471; +795001;0.0233563; +796001;0.0231775; +797001;0.0232941; +798001;0.0228844; +799001;0.02271; +800001;0.0228228; +801001;0.0226824; +802001;0.0221153; +803001;0.0224021; +804001;0.022659; +805001;0.0229164; +806001;0.022683; +807001;0.0224686; +808001;0.0223118; +809001;0.0225093; +810001;0.0223637; +811001;0.0226952; +812001;0.0251404; +813001;0.0274033; +814001;0.0224656; +815001;0.0229684; +816001;0.0227023; +817001;0.0243674; +818001;0.0230157; +819001;0.0223948; +820001;0.0223791; +821001;0.0223386; +822001;0.0229251; +823001;0.0231487; +824001;0.0226125; +825001;0.0227636; +826001;0.0226505; +827001;0.0221704; +828001;0.0219071; +829001;0.0224045; +830001;0.0224254; +831001;0.0221653; +832001;0.0226684; +833001;0.0225827; +834001;0.0225674; +835001;0.0221277; +836001;0.0222189; +837001;0.0218636; +838001;0.0220255; +839001;0.0216752; +840001;0.0220424; +841001;0.0223153; +842001;0.0220502; +843001;0.0222888; +844001;0.0223842; +845001;0.0223718; +846001;0.0223306; +847001;0.0223855; +848001;0.0223165; +849001;0.0238207; +850001;0.0226931; +851001;0.0222099; +852001;0.0224241; +853001;0.0224394; +854001;0.0222189; +855001;0.0219746; +856001;0.0350116; +857001;0.028005; +858001;0.0234783; +859001;0.0228089; +860001;0.0236031; +861001;0.0237798; +862001;0.0237001; +863001;0.0230194; +864001;0.022966; +865001;0.0233031; +866001;0.0233671; +867001;0.0229765; +868001;0.0222069; +869001;0.0225774; +870001;0.0222305; +871001;0.0220432; +872001;0.0227716; +873001;0.0225356; +874001;0.0224928; +875001;0.0220348; +876001;0.0225574; +877001;0.0226006; +878001;0.0261645; +879001;0.0221714; +880001;0.0222906; +881001;0.0221378; +882001;0.0223634; +883001;0.0293881; +884001;0.0225705; +885001;0.0222922; +886001;0.0223651; +887001;0.022484; +888001;0.0224685; +889001;0.0231379; +890001;0.0226749; +891001;0.0226601; +892001;0.0228082; +893001;0.0223149; +894001;0.0224184; +895001;0.0223675; +896001;0.022099; +897001;0.0223337; +898001;0.0227934; +899001;0.0256687; +900001;0.024356; +901001;0.0230691; +902001;0.0225954; +903001;0.0226281; +904001;0.022547; +905001;0.0222503; +906001;0.0227845; +907001;0.0232737; +908001;0.0225957; +909001;0.0224548; +910001;0.0284866; +911001;0.0224852; +912001;0.0219689; +913001;0.02247; +914001;0.0223789; +915001;0.0223245; +916001;0.0224082; +917001;0.0222221; +918001;0.0223718; +919001;0.0230577; +920001;0.0227464; +921001;0.0226724; +922001;0.0223465; +923001;0.0218772; +924001;0.0221017; +925001;0.0220882; +926001;0.0224033; +927001;0.0231403; +928001;0.021777; +929001;0.0218871; +930001;0.022978; +931001;0.0298374; +932001;0.0218594; +933001;0.0217164; +934001;0.0216996; +935001;0.0221743; +936001;0.021958; +937001;0.0216807; +938001;0.0221103; +939001;0.0217634; +940001;0.0216869; +941001;0.0220972; +942001;0.0215014; +943001;0.0263714; +944001;0.0289717; +945001;0.0218618; +946001;0.0216347; +947001;0.0245289; +948001;0.0287891; +949001;0.0292987; +950001;0.0299392; +951001;0.0297075; +952001;0.0300344; +953001;0.0293254; +954001;0.029154; +955001;0.0295389; +956001;0.0291967; +957001;0.0295022; +958001;0.0247234; +959001;0.0224954; +960001;0.0218175; +961001;0.0219593; +962001;0.022105; +963001;0.0225716; +964001;0.0220293; +965001;0.0218136; +966001;0.0218288; +967001;0.0223044; +968001;0.0221713; +969001;0.0220735; +970001;0.0218105; +971001;0.021904; +972001;0.0271583; +973001;0.0228952; +974001;0.0231112; +975001;0.0224962; +976001;0.0223215; +977001;0.0228982; +978001;0.0223205; +979001;0.0222691; +980001;0.0223038; +981001;0.0226408; +982001;0.0222032; +983001;0.0224058; +984001;0.028874; +985001;0.0302751; +986001;0.0242848; +987001;0.0226021; +988001;0.0228134; +989001;0.0226849; +990001;0.0224208; +991001;0.0226547; +992001;0.0219944; +993001;0.0225453; +994001;0.0221217; +995001;0.023027; +996001;0.0224441; +997001;0.0230408; +998001;0.0228266; +999001;0.0227225; +1000001;0.0226352;