apache和nginx性能差很多嗎?
Nginx性能要比Apache高,主要是由于網絡IO模型選擇不同,Nginx使用是最新的epoll網絡I/O模型,而Apache使用的則是傳統的select模型。Nginx是異步非阻塞,Apache是同步阻塞。
同步與異步同步:同步是指調用者發起一個請求,直到請求返回結果之后,才進行下一步操作。簡單來說,同步就是必須一件事一件事的做,等前一件做完了,才能做下一件事。
異步:調用者發起一個請求,在沒有得到返回結果之前,可以繼續執行后續操作。異步相對同步來講,二者的區別主要在于是否需要等待某操作的返回結果。
阻塞與非阻塞阻塞:阻塞一般是指在調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才會被喚醒執行后續的操作。
非阻塞:非阻塞是指在調用結果沒有返回之前,該調用不會阻塞住當前線程。
epollepoll是指當文件描述符的內核緩沖區非空的時候,發出可讀信號進行通知,當寫緩沖區不滿的時候,發出可寫信號的一種I/O事件通知機制,是linux 內核實現IO多路復用的一個實現。
文件描述符數目沒有上限:通過epoll_ctl()來注冊一個文件描述符,內核中使用紅黑樹的數據結構來管理所有需要監控的文件描述符。基于事件就緒通知方式:一旦被監聽的某個文件描述符就緒,內核會采用類似于callback的回調機制,迅速激活這個文件描述符,這樣隨著文件描述符數量的增加,也不會影響判定就緒的性能。維護就緒隊列:當文件描述符就緒,就會被放到內核中的一個就緒隊列中,這樣調用epoll_weit獲取就緒文件描述符的時候,只要取隊列中的元素即可,操作的時間復雜度恒為O(1)。使用mmap加速內核與用戶空間的消息傳遞。selectselect()的可移植性更好,在某些Unix系統上不支持poll()。select() 對于超時值提供了更好的精度:微秒,而poll是毫秒。單個進程可監視的fd數量被限制。需要維護一個用來存放大量fd的數據結構,這樣會使得用戶空間和內核空間在傳遞該結構時復制開銷大。對fd進行掃描時是線性掃描。fd劇增后,IO效率較低,因為每次調用都對fd進行線性掃描遍歷,所以隨著fd的增加會造成遍歷速度慢的性能問題。select() 函數的超時參數在返回時也是未定義的,考慮到可移植性,每次在超時之后在下一次進入到select之前都需要重新設置超時參數。總結Linux下能夠承受高并發訪問的Squid、Memcached都采用的是epoll,epoll是一種IO多路復用技術,可以非常高效的處理數以百萬計的socket句柄,比起select效率會高一些。epoll不會隨著監聽fd(文件描述符)數目的增長而降低效率。select采用的是輪詢來處理,在高并發服務器中,輪詢I/O是最耗時間的操作之一,輪詢的fd(文件描述符)數目越多,自然耗時越多,性能越低。Nginx運行效率高、CPU內存占用率低、代理功能強大、占用資源少、支持更多的并發連接,主要用來做動靜分離和負載均衡。Apache在動態資源處理和穩定性方便要優于Nginx,但是靜態資源處理不如Nginx。
如果解決了你的疑惑,請點點贊,點點關注,謝謝。