MySQL詳解(8)----------MySQL線程池總結(二),mysql線程池

來源:互聯網
上載者:User

MySQL詳解(8)----------MySQL線程池總結(二),mysql線程池
這篇文章是對上篇文章的一個補充,主要圍繞以下兩點展開,one-connection-per-thread的實現方式以及線程池中epoll的使用。one-connection-per-thread

根據scheduler_functions的模板,我們也可以列出one-connection-per-thread方式的幾個關鍵函數。

static scheduler_functions con_per_functions={ max_connection+1, // max_threadsNULL,NULL,NULL, // initInit_new_connection_handler_thread, // init_new_connection_threadcreate_thread_to_handle_connection, // add_connectionNULL, // thd_wait_beginNULL, // thd_wait_endNULL, // post_kill_notificationone_thread_per_connection_end, // end_threadNULL // end};

1.init_new_connection_handler_thread

這個介面比較簡單,主要是調用pthread_detach,將線程設定為detach狀態,線程結束後自動釋放所有資源。

2.create_thread_to_handle_connection

這個介面是處理新串連的介面,對於線程池而言,會從thread_id%group_size對應的group中擷取一個線程來處理,而one-connection-per-thread方式則會判斷是否有thread_cache可以使用,如果沒有則建立線程來處理。具體邏輯如下:

(1).判斷緩衝的線程數是否使用完(比較blocked_pthread_count 和wake_pthread大小)

(2).若還有緩衝線程,將thd加入waiting_thd_list的隊列,喚醒一個等待COND_thread_cache的線程

(3).若沒有,建立一個新的線程處理,線程的入口函數是do_handle_one_connection

(4).調用add_global_thread加入thd數組。

3.do_handle_one_connection

這個介面被create_thread_to_handle_connection調用,處理請求的主要實現介面。

(1).迴圈調用do_command,從socket中讀取網路包,並且解析執行;

(2). 當遠程用戶端發送關閉串連COMMAND(比如COM_QUIT,COM_SHUTDOWN)時,退出迴圈

(3).調用close_connection關閉串連(thd->disconnect());

(4).調用one_thread_per_connection_end函數,確認是否可以複用線程

(5).根據返回結果,確定退出背景工作執行緒還是繼續迴圈執行命令。

4.one_thread_per_connection_end

判斷是否可以複用線程(thread_cache)的主要函數,邏輯如下:

(1).調用remove_global_thread,移除線程對應的thd執行個體

(2).調用block_until_new_connection判斷是否可以重用thread

(3).判斷緩衝的線程是否超過閥值,若沒有,則blocked_pthread_count++;

(4).阻塞等待條件變數COND_thread_cache

(5).被喚醒後,表示有新的thd需要重用線程,將thd從waiting_thd_list中移除,使用thd初始化線程的thd->thread_stack

(6).調用add_global_thread加入thd數組。

(7).如果可以重用,返回false,否則返回ture

線程池與epoll

在引入線程池之前,server層只有一個監聽線程,負責監聽mysql連接埠和本地unixsocket的請求,對於每個新的串連,都會分配一個獨立線程來處理,因此監聽線程的任務比較輕鬆,mysql通過poll或select方式來實現IO的多工。引入線程池後,除了server層的監聽線程,每個group都有一個監聽線程負責監聽group內的所有串連socket的串連請求,背景工作執行緒不負責監聽,只處理請求。對於overscribe為1000的線程池設定,每個監聽線程需要監聽1000個socket的請求,監聽線程採用epoll方式來實現監聽。

Select,poll,epoll都是IO多工機制,IO多工通過一種機制,可以監聽多個fd(描述符),比如socket,一旦某個fd就緒(讀就緒或寫就緒),能夠通知程式進行相應的讀寫操作。epoll相對於select和poll有了很大的改進,首先epoll通過epoll_ctl函數註冊,註冊時,將所有fd拷貝進核心,只拷貝一次不需要重複拷貝,而每次調用poll或select時,都需要將fd集合從使用者空間拷貝到核心空間(epoll通過epoll_wait進行等待);其次,epoll為每個描述符指定了一個回呼函數,當裝置就緒時,喚醒等待者,通過回呼函數將描述符加入到就緒鏈表,無需像select,poll方式採用輪詢方式;最後select預設只支援1024個fd,epoll則沒有限制,具體數字可以參考cat /proc/sys/fs/file-max的設定。epoll貫穿線上程池使用的過程中,下面我就epoll的建立,使用和銷毀生命週期來描述epoll線上程中是如何使用的。

備忘:

1.註冊在epoll的fd,若請求就緒,則將對應的event放入到events數組,並將該fd的事務類型清空,因此對於老的串連請求,依然需要調用epoll_ctl(pollfd, EPOLL_CTL_MOD, fd, &ev)來註冊。

線程池函數調用關係

(1)建立epoll

tp_init->thread_group_init->tp_set_threadpool_size->io_poll_create->epoll_create

(2)關閉epoll

tp_end->thread_group_close->thread_group_destroy->close(pollfd)

(3)關聯socket描述符

handle_event->start_io->io_poll_associate_fd->io_poll_start_read->epoll_ctl

(4)處理串連請求

handle_event->threadpool_process_request->do_command->dispatch_command->mysql_parse->mysql_execute_command

(5)背景工作執行緒空閑時

worker_main->get_event->pthread_cond_timedwait

等待thread_pool_idle_timeout後,退出。

(6)監聽epoll

worker_main->get_event->listener->io_poll_wait->epoll_wait

(7)連接埠監聽線程

main->mysqld_main->handle_connections_sockets->poll

one-connection-per-thread函數調用關係

(1) 背景工作執行緒等待請求

handle_one_connection->do_handle_one_connection->do_command->

my_net_read->net_read_packet->net_read_packet_header->net_read_raw_loop->

vio_read->vio_socket_io_wait->vio_io_wait->poll

備忘:與線程池的背景工作執行緒有監聽線程協助其監聽請求不同,one-connection-per-thread方式的背景工作執行緒在空閑時,會調用poll阻塞等待網路包過來;

而線程池的背景工作執行緒只需要專心處理請求即可,所以使用也更充分。

(2)連接埠監聽線程

與線程池的(7)相同

參考文檔

http://www.cnblogs.com/Anker/p/3265058.html

http://blog.csdn.net/zhanglu5227/article/details/7960677

著作權聲明:歡迎轉轉載,希望轉載的同時添加原文地址,謝謝合作,學習快樂!

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.