Fully implemented multi_th test and got test results
parent
a287ea3d92
commit
ac02149c6d
Binary file not shown.
|
@ -1,11 +1,11 @@
|
||||||
#include <asm-generic/errno-base.h>
|
|
||||||
#include <asm-generic/errno.h>
|
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <cinttypes>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstdio> // for fprintf()
|
#include <cstdio> // for fprintf()
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <queue>
|
||||||
#include <ratio>
|
#include <ratio>
|
||||||
#include <unistd.h> // for close(), read()
|
#include <unistd.h> // for close(), read()
|
||||||
#include <sys/epoll.h> // for epoll_create1(), epoll_ctl(), struct epoll_event
|
#include <sys/epoll.h> // for epoll_create1(), epoll_ctl(), struct epoll_event
|
||||||
|
@ -121,8 +121,11 @@ void term_handler(int signal) {
|
||||||
|
|
||||||
std::atomic<uint64_t> grandtotal_kb;
|
std::atomic<uint64_t> grandtotal_kb;
|
||||||
|
|
||||||
|
std::queue<std::pair<int, uint64_t>> data_queue;
|
||||||
|
std::mutex queue_mutex;
|
||||||
|
|
||||||
void thradizable(int &epoll_fd, int &master_socket, int buf_size, const int &th_flag, const int thread_index) {
|
|
||||||
|
void thradizable(int &epoll_fd, int &master_socket, const int &th_flag, const int thread_index) {
|
||||||
epoll_event events[MAX_EVENTS];
|
epoll_event events[MAX_EVENTS];
|
||||||
uint64_t bytes_read = 0;
|
uint64_t bytes_read = 0;
|
||||||
uint64_t kBytes_read = 0;
|
uint64_t kBytes_read = 0;
|
||||||
|
@ -144,6 +147,8 @@ void thradizable(int &epoll_fd, int &master_socket, int buf_size, const int &th_
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Iterate on the sockets having events
|
// Iterate on the sockets having events
|
||||||
for (int i = 0; i < nfds; i++) {
|
for (int i = 0; i < nfds; i++) {
|
||||||
//printf("Tot fds = %d reading from %d\n", nfds, i);
|
//printf("Tot fds = %d reading from %d\n", nfds, i);
|
||||||
|
@ -157,21 +162,34 @@ void thradizable(int &epoll_fd, int &master_socket, int buf_size, const int &th_
|
||||||
printf("Closing %d", fd);
|
printf("Closing %d", fd);
|
||||||
close(fd);
|
close(fd);
|
||||||
} else {
|
} else {
|
||||||
|
uint64_t part = grandtotal_kb;
|
||||||
|
//printf("Ev trig th %d with tot b %lu\n", thread_index, part);
|
||||||
// Than we received data from one of the monitored sockets
|
// Than we received data from one of the monitored sockets
|
||||||
char buffer[buf_size];
|
uint64_t buffer[8];
|
||||||
int valread = 0;
|
int valread = 0;
|
||||||
//while (valread != EAGAIN) {
|
//while (valread != EAGAIN) {
|
||||||
valread = recv(fd, &buffer, buf_size, 0);
|
std::unique_lock<std::mutex> lk(queue_mutex);
|
||||||
|
valread = recv(fd, reinterpret_cast<char*>(buffer), sizeof(buffer), 0);
|
||||||
if (valread > 0) {
|
if (valread > 0) {
|
||||||
//printf("[RICEVUTO]\t FROM %d\n", fd);
|
//printf("[RICEVUTO]\t FROM %d\n", fd);
|
||||||
|
|
||||||
|
int opt_incr = (valread % 8) ? 1 : 0;
|
||||||
|
for (int q_i = 0; q_i < (valread/8) + opt_incr; q_i++) {
|
||||||
|
data_queue.push(std::pair<int, uint64_t>(thread_index, buffer[q_i]));
|
||||||
|
}
|
||||||
|
grandtotal_kb += valread;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
bytes_read += valread;
|
bytes_read += valread;
|
||||||
int kilos = 0;
|
int kilos = 0;
|
||||||
if ((kilos = bytes_read / 1024) > 0) {
|
if ((kilos = bytes_read / 1024) > 0) {
|
||||||
kBytes_read += kilos;
|
kBytes_read += kilos;
|
||||||
bytes_read -= (kilos * 1024);
|
bytes_read -= (kilos * 1024);
|
||||||
//printf("reade bites %lu", bytes_read);
|
//printf("reade bites %lu", bytes_read);
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
lk.unlock();
|
||||||
//}
|
//}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -195,6 +213,35 @@ void thradizable(int &epoll_fd, int &master_socket, int buf_size, const int &th_
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<uint64_t> popped;
|
||||||
|
|
||||||
|
|
||||||
|
void printer_thread() {
|
||||||
|
while (1) {
|
||||||
|
std::unique_lock<std::mutex> lk(queue_mutex);
|
||||||
|
if (!data_queue.empty()) {
|
||||||
|
std::pair<int, uint64_t> element = data_queue.front();
|
||||||
|
data_queue.pop();
|
||||||
|
popped.push_back(element.second);
|
||||||
|
//printf("Element: %lu from thread %d\n", element.second, element.first);
|
||||||
|
|
||||||
|
if (element.second == 999) {
|
||||||
|
int fail_flag = 0;
|
||||||
|
for (int i = 1; i < 999; i++) {
|
||||||
|
if (popped[i] == i) continue;
|
||||||
|
else fail_flag = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fail_flag == 1) printf("FAILURE\n");
|
||||||
|
else printf("success\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lk.unlock();
|
||||||
|
usleep(10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char const *argv[]) {
|
int main(int argc, char const *argv[]) {
|
||||||
|
|
||||||
signal(SIGTERM, term_handler);
|
signal(SIGTERM, term_handler);
|
||||||
|
@ -229,7 +276,6 @@ int main(int argc, char const *argv[]) {
|
||||||
fcntl(master_socket, F_SETFL, flags | O_NONBLOCK);
|
fcntl(master_socket, F_SETFL, flags | O_NONBLOCK);
|
||||||
|
|
||||||
epoll_event ev, events[MAX_EVENTS];
|
epoll_event ev, events[MAX_EVENTS];
|
||||||
std::array<std::mutex, MAX_EVENTS> mutex_array;
|
|
||||||
std::array<uint64_t, MAX_EVENTS> kBytes_read_on_descr;
|
std::array<uint64_t, MAX_EVENTS> kBytes_read_on_descr;
|
||||||
|
|
||||||
//The atomic here is used as a flag to tell the thread to stop
|
//The atomic here is used as a flag to tell the thread to stop
|
||||||
|
@ -252,95 +298,22 @@ int main(int argc, char const *argv[]) {
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int> sizes;
|
std::array<std::thread, 2> vT;
|
||||||
std::vector<uint64_t> tot_received_data;
|
std::array<int, 2> thread_flags;
|
||||||
std::vector<double> times;
|
|
||||||
|
|
||||||
grandtotal_kb = 0;
|
for (int t_i = 0; t_i < 2; t_i++) {
|
||||||
int increment = 499;
|
thread_flags[t_i] = 0;
|
||||||
|
vT[t_i] = std::thread(thradizable, std::ref(epoll_fd), std::ref(master_socket), std::cref(thread_flags.at(t_i)), t_i);
|
||||||
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);
|
|
||||||
|
|
||||||
std::array<std::thread, 4> vT;
|
|
||||||
std::array<int, 4> thread_flags;
|
|
||||||
|
|
||||||
for (int t_i = 0; t_i < 4; t_i++) {
|
|
||||||
thread_flags[t_i] = 0;
|
|
||||||
vT[t_i] = std::thread(thradizable, std::ref(epoll_fd), std::ref(master_socket), buf_size, std::cref(thread_flags.at(t_i)), t_i);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string command = "";
|
|
||||||
std::string ref("go");
|
|
||||||
if ( increment == 499){
|
|
||||||
while (command != "go") {
|
|
||||||
std::cout << "Insert command: ";
|
|
||||||
std::cin >> command;
|
|
||||||
std::cout << command << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "starting measurement with current buf size: " << buf_size << std::endl;
|
|
||||||
|
|
||||||
auto start = std::chrono::high_resolution_clock::now();
|
|
||||||
grandtotal_kb = 0;
|
|
||||||
|
|
||||||
sleep(30);
|
|
||||||
for (int t_i = 0; t_i < 4; t_i++) {
|
|
||||||
thread_flags[t_i] = 1;
|
|
||||||
vT[t_i].join();
|
|
||||||
}
|
|
||||||
uint64_t local_kB = grandtotal_kb;
|
|
||||||
auto end = std::chrono::high_resolution_clock::now();
|
|
||||||
double time_taken = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
|
|
||||||
//time taken in milliseconds
|
|
||||||
time_taken *= 1e-6;
|
|
||||||
|
|
||||||
times.push_back(time_taken);
|
|
||||||
sizes.push_back(buf_size);
|
|
||||||
tot_received_data.push_back(local_kB);
|
|
||||||
|
|
||||||
buf_size += increment;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::thread printer(printer_thread);
|
||||||
|
|
||||||
|
|
||||||
|
printer.join();
|
||||||
|
|
||||||
|
|
||||||
std::ofstream fout;
|
|
||||||
fout.open("epoll_data_stats_1000_multith_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)) {
|
if (close(epoll_fd)) {
|
||||||
printf("Failed to close epoll file descriptor");
|
printf("Failed to close epoll file descriptor");
|
|
@ -0,0 +1,14 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
for i in $(seq 1 1000);
|
||||||
|
do
|
||||||
|
echo "exec $i" >> res.txt
|
||||||
|
./ev_builder.out 7777 >> res.txt &
|
||||||
|
sleep 1
|
||||||
|
./prov.out &
|
||||||
|
sleep 3
|
||||||
|
kill -15 `pidof ./ev_builder.out`
|
||||||
|
kill -15 `pidof ./prov.out`
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
Binary file not shown.
|
@ -15,6 +15,8 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define BIGDIM 10000
|
||||||
|
|
||||||
int makeSocket() {
|
int makeSocket() {
|
||||||
int sockfd;
|
int sockfd;
|
||||||
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
||||||
|
@ -39,44 +41,22 @@ void connectTo(int sock, const char* host, int port) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
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<double>(timeout) / 1000);
|
|
||||||
|
|
||||||
int socket = makeSocket();
|
int socket = makeSocket();
|
||||||
connectTo(socket, "127.0.0.1", 7777);
|
connectTo(socket, "127.0.0.1", 7777);
|
||||||
|
|
||||||
//allocating 100 megabytes of memory
|
uint64_t alotofvalues[BIGDIM];
|
||||||
uint64_t* chunky_boy = new uint64_t[67108];
|
|
||||||
size_t chunky_boy_size = 67108 * sizeof(uint64_t);
|
|
||||||
printf("chonky size %d", static_cast<int>(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<char*>(chunky_boy) + j, std::min(static_cast<int>(chunky_boy_size) - j, buffer_size), 0);
|
|
||||||
if (timeout != 0) {
|
|
||||||
sleep(timeout);
|
|
||||||
}
|
|
||||||
j += buffer_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
//usleep(1000);
|
|
||||||
|
|
||||||
|
for (int i = 1; i < BIGDIM; i++) {
|
||||||
|
alotofvalues[i] = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int send_counter = 0;
|
||||||
|
for (;;) {
|
||||||
|
alotofvalues[0] = send_counter;
|
||||||
|
ssize_t bytes = send(socket, reinterpret_cast<char*>(alotofvalues), sizeof(alotofvalues), 0);
|
||||||
|
sleep(10000);
|
||||||
|
send_counter++;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue