IO讀寫基礎 應用層在進行read,write系統調用時,不是物理級別的讀寫,而是緩存的複製,進程緩衝區同內核緩衝區的緩存複製,底層數據交換是有由操作系統內核完成,控制內核緩衝與硬體(物理設備)之間數據交換.linux系統在系統內核只有一個內核緩衝區,用戶進程都有獨立的緩衝區,是進程緩衝區。外部設備 ...
IO讀寫基礎
應用層在進行read,write系統調用時,不是物理級別的讀寫,而是緩存的複製,進程緩衝區同內核緩衝區的緩存複製,底層數據交換是有由操作系統內核完成,控制內核緩衝與硬體(物理設備)之間數據交換.linux系統在系統內核只有一個內核緩衝區,用戶進程都有獨立的緩衝區,是進程緩衝區。外部設備的直接讀寫涉及操作系統的中斷,底層操作會對內核緩衝區進行監控,等待緩衝區達到一定數量的時候,再進行IO設備的中斷處理,集中執行物理設備的實際IO操作,這種機制提升了系統的性能,至於什麼時候中斷(讀中斷、寫中斷),由操作系統的內核來決定,用戶程式則不需要關心.
2、同步非阻塞IO: 不斷的進行IO系統調用,輪詢數據狀態,用戶線程不會阻塞,會占用大量的CPU時間,在高併發場景下,也不採可.簡稱NIO.
3、 IO多路復用:
系統調用,一種是select/epoll(就緒查詢),一種是IO操作,輪詢查找出達到IO操作就緒的socket連,一個選擇器查詢線程可處理成千上萬個連接,不必創建維護大量線程,減小系統開銷,缺點>select/epoll系統調用是阻塞式的,屬於同步IO.都需要在讀寫事件就緒後,由系統調用本身負責進行讀寫,也就是說這個讀寫過程是阻塞的。
4、非同步IO:AIO
在內核等待數據和複製數據的兩個階段,用戶線程都不是阻塞的。用戶線程需要接收內核的IO操作完成的事件,或者用戶線程需要註冊一個IO操作完成的回調函數。非同步IO有時也被稱為信號驅動IO.缺點>應用程式僅需要進行事件的註冊與接收,其餘的工作都留給了操作系統,即需要底層內核提供支持。目前Windows系統下通過IOCP實現了真正的非同步IO,在linux系統中還不太完善。
高併發連接數配置
在生產環境Linux系統中,基本上都需要解除文件句柄數的限制。文件句柄,也叫文件描述符。文件描述符(File Descriptor)是內核為了高效管理已被打開的文件所創建的索引,它是一個非負整數(通常是小整數),用於指代被打開的文件。所有的IO系統調用,包括socket的讀寫調用,都是通過文件描述符完成的。
ulimit -n
一個高併發的應用,併發連接數可以達到數十萬百萬千萬級別,文件句柄數不夠,當單個進程打開的文件句柄數量,超過了系統配置的上限值時,會發出“Socket/File:Can't open so many files”的錯誤提示。
ulimit -n 1000000
永久修改配置,可以編輯 /etc/rc.local 開機啟動文件,在文件中添加如下內容,選項-S表示軟性極限值,-H表示硬性極限值
ulimit -SHn 1000000
終極解除Linux系統的最大文件打開數量的限制,編輯Linux的極限配置文件/etc/security/limits.conf來解決,加入如下內容
#軟性極限 soft nofile 1000000 #硬性極限 hard nofile 1000000
軟性極限是系統警告(Warning)的極限值,超過這個極限值,內核會發出警告。