Efficient Parallel I/O on Multi-Core Architectures

Efficient Parallel I/O on Multi-Core Architectures

Lecture series title/ lecture title Efficient parallel I/O on multi-core architectures Adrien Devresse CERN IT-SDC-ID Thematic CERN School of Computing 2014 1 Author(s) names – Affiliation Lecture series title/ lecture title How to make I/O bound application scale with multi-core ? What is an IO bound application ? → A server application → A job that accesses big number of files → An application that uses intensively network 2 Author(s) names – Affiliation Lecture series title/ lecture title Stupid example: Simple server monothreaded // create socket socket_desc = socket(AF_INET , SOCK_STREAM , 0); // bind the socket bind(socket_desc,(struct sockaddr *)&server , sizeof(server)); listen(socket_desc , 100); //accept connection from an incoming client while(1){ // declarations client_sock = accept(socket_desc, (struct sockaddr *)&client, &c); //Receive a message from client while( (read_size = recv(client_sock , client_message , 2000 , 0)) > 0{ // Wonderful, we have a client, do some useful work std::string msg("hello bob"); write(client_sock, msg.c_str(), msg.size()); } } 3 Author(s) names – Affiliation Lecture series title/ lecture title Stupid example: Let's make it parallel ! int main(int argc, char** argv){ // creat socket void do_work(int socket){ socket_desc = socket(AF_INET , SOCK_STREAM , 0); //Receive a message while( (read_size = // bind the socket recv(client_sock , bind(socket_desc, server , sizeof(server)); client_message , 2000 , 0)) > 0{ listen(socket_desc , 100); // Wonderful, we have a client // useful works //accept connection from an incoming client } while(1){ } // declarations client_sock = accept(socket_desc, (struct sockaddr *)&client, &c); new std::thread(bind(do_work, client_sock)); } } 4 Author(s) names – Affiliation Lecture series title/ lecture title Wonderful and easy isn't it ? 5 Author(s) names – Affiliation Lecture series title/ lecture title Wonderful and easy isn't it ? It does NOT scale 6 Author(s) names – Affiliation Lecture series title/ lecture title Why this does not scale ? void do_work(int socket){ //Receive a message while( (read_size = recv(client_sock , client_message , 2000 , 0)) > 0{ // Wonderful, we have a client // useful works } } → Blocking IO → Your thread will spend most of the time to wait in I/O → Limiting factor : number of threads you can spawn 7 Author(s) names – Affiliation Lecture series title/ lecture title Solution ? Use asynchronous I/O and event based model 8 Author(s) names – Affiliation Lecture series title/ lecture title Solution : Event based Reactor Pattern and NON blocking I/O 1- One event loop for incoming I/O events → Use event monitoring function → Select()/ poll() / epoll()/ kqueue() 2- The events are dispatched into tasks 3- Execute tasks in a ThreadPool 4- Send back I/O operations to themain thread 9 Author(s) names – Affiliation Lecture series title/ lecture title Event I/O architecture Thread pool Working Thread Select() / epoll() / Yes, Working Thread kqueue() Let read data Working Thread Working Thread IO Is data Working Thread ready ? Need I/O ? No Send next I/O operation to event loop 10 Author(s) names – Affiliation Lecture series title/ lecture title Advantages of Reactor pattern → No need to spawn one thread per query → Thread pool for task execution → Lower memory consumption → Keep thread doing active work → Maximize processor usage → Allow for fine grain scheduling with requests 11 Author(s) names – Affiliation Lecture series title/ lecture title You can use existing solutions → Boost Asynchronous I/O : ASIO → Libevent ( C ) → Most mature implementation → LibUV → node.js backend → POSIX ASIO asynchronous I/O → scalability limited → Green Threads → If your language support it 12 Author(s) names – Affiliation Lecture series title/ lecture title More about this References : ➔ C10K publication : ➔ http://www.kegel.com/c10k.html ➔ Boost ASIO documentation examples : ➔ http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/examples/cpp11_e xamples.html ● LibEvent website: ➔ http://libevent.org/ ➔ Reactor vs proactor pattern ➔ Node.js 13 Author(s) names – Affiliation Lecture series title/ lecture title Conclusion • Use asynchronous I/O in I/O bound softwares • Use a ThreadPool instead of One thread per request • Use task/event base model. 14 Author(s) names – Affiliation.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    14 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us