新聞中心
在Linux中,文件I/O操作會(huì)消耗大量的CPU資源和內(nèi)存,因此在高負(fù)載環(huán)境下,它可能會(huì)成為系統(tǒng)性能的瓶頸。為了優(yōu)化系統(tǒng)性能,Linux O DirectIO技術(shù)應(yīng)運(yùn)而生。本文將對該技術(shù)進(jìn)行簡要介紹。

一、概述
Linux O DirectIO 技術(shù)原理是:在進(jìn)行文件操作時(shí),利用異步I/O(O)接口來代替直接的同步I/O操作方式,通過利用Linux內(nèi)核中的Direct IO(DirectIO)接口,直接將數(shù)據(jù)從硬盤讀取到應(yīng)用程序的內(nèi)存空間,從而避免了數(shù)據(jù)從內(nèi)核空間到用戶空間的拷貝,減少了CPU和內(nèi)存的消耗,提高了系統(tǒng)磁盤I/O性能。
二、Direct IO
Direct IO是一種繞過文件系統(tǒng)緩存的數(shù)據(jù)讀寫方式,即直接將數(shù)據(jù)讀取到應(yīng)用程序的內(nèi)存空間,或?qū)?yīng)用程序中的數(shù)據(jù)直接寫入硬盤中。與之相對的,非Direct IO的方式是將數(shù)據(jù)先讀入文件系統(tǒng)緩存,再從緩存中讀取,或?qū)?shù)據(jù)寫入緩存中,再由緩存寫入硬盤。
使用Direct IO的優(yōu)點(diǎn)是:
1、減少了CPU和內(nèi)存的占用。由于避免了數(shù)據(jù)緩存到內(nèi)存中,因此減少了CPU和內(nèi)存的使用。
2、提高了IO性能。由于數(shù)據(jù)直接從磁盤讀取,而不是先緩存到內(nèi)存中,IO性能得到了提升。
使用Direct IO的缺點(diǎn)是:
1、數(shù)據(jù)讀寫效率的不穩(wěn)定。因?yàn)閿?shù)據(jù)直接從磁盤讀取,而磁盤的讀寫速度較慢,因此在一些情況下,使用Direct IO的讀寫效率會(huì)比非Direct IO的方式低。
2、不支持緩存。由于繞過了文件系統(tǒng)緩存,因此無法利用文件系統(tǒng)的緩存機(jī)制。在一些情況下,這可能會(huì)降低系統(tǒng)的整體性能。
三、Linux O
O是指操作系統(tǒng)提供的異步I/O接口,可以用來實(shí)現(xiàn)異步的文件讀寫操作。Linux中,O接口可以通過libo庫調(diào)用。
O的優(yōu)點(diǎn)是:
1、高效的I/O操作。 O在進(jìn)行I/O操作時(shí),會(huì)將I/O請求放入內(nèi)核完成隊(duì)列中,內(nèi)核處理完I/O請求后再通知用戶程序,從而實(shí)現(xiàn)異步的I/O操作,提高了系統(tǒng)I/O性能。
2、多線程并行。 O允許多個(gè)I/O請求同時(shí)發(fā)起,從而實(shí)現(xiàn)系統(tǒng)I/O多線程并行操作,提高了整體系統(tǒng)的處理性能。
四、Linux O DirectIO 技術(shù)
Linux O DirectIO 技術(shù)結(jié)合了O和Direct IO技術(shù),將數(shù)據(jù)直接從磁盤讀取到應(yīng)用程序中,避免了數(shù)據(jù)從內(nèi)核空間到用戶空間的拷貝,減少了CPU和內(nèi)存的占用,提高了系統(tǒng)磁盤I/O性能。但是,使用該技術(shù)需要注意一些問題:
1、文件對齊。 Direct IO要求讀寫的數(shù)據(jù)大小必須是磁盤I/O塊大小的整數(shù)倍,否則會(huì)導(dǎo)致讀寫性能下降。
2、內(nèi)存對齊。 Direct IO要求讀寫內(nèi)存的地址必須是內(nèi)存I/O塊大小的整數(shù)倍,否則會(huì)導(dǎo)致讀寫性能下降。
3、數(shù)據(jù)量控制。 Direct IO要求一次讀寫的數(shù)據(jù)量不能大于系統(tǒng)可用內(nèi)存的一半,否則會(huì)導(dǎo)致系統(tǒng)性能下降。
五、
Linux O DirectIO技術(shù)通過利用異步I/O接口和直接IO接口,實(shí)現(xiàn)了數(shù)據(jù)直接從磁盤讀取到應(yīng)用程序中,避免了CPU和內(nèi)存的浪費(fèi),提高了系統(tǒng)磁盤IO性能。但是,使用該技術(shù)需要注意一些限制條件,避免出現(xiàn)性能問題。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
linux python connect 對同一個(gè)端口可以建立多少個(gè)
如果是tcp client用同一個(gè)本地端口去連不同的兩個(gè)服務(wù)器ip,連第二個(gè)時(shí)就會(huì)提示端口已被占用。但服務(wù)器的監(jiān)聽端口,可以accept多次,建立多個(gè)socket;我的問題是服務(wù)器一個(gè)端口為什么能建立多個(gè)連接而客戶端卻不行呢?
TCP server 可以,TCP client 也可以。一個(gè)套接字只能建立一個(gè)連接,無論對于 server 還是 client。
注意報(bào)錯(cuò)消息是:
(EISCONN) Transport endpoint is already connected
man 2 connect 說得很清楚了:
Generally, connection-based protocol sockets may successfully connect() only once; connectionless protocol sockets may use connect() multiple times to change their association.
就是說,TCP 套接字最多只能調(diào)用 connect 一次。那么,你的監(jiān)聽套接字調(diào)用 connect 了幾次?
來點(diǎn)有意思的。
一個(gè)套接字不能連接兩次,并不代表一個(gè)本地地址不能用兩次,看!****加粗文字**加粗文字**
>>> import socket
>>> s = socket.socket()
# since Linux 3.9, 見 man 7 socket
>>> s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
>>> s2 = socket.socket()
>>> s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
>>> s.bind((‘127.0.0.1’, 12345))
>>> s2.bind((‘127.0.0.1’, 12345))
# 都可以使用同一本地地址來連接哦
>>> s.connect((‘127.0.0.1’, 80))
>>> s2.connect((‘127.0.0.1’, 4321))
>>> netstat -npt | grep 12345
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 127.0.0.1:127.0.0.1:ESTABLISHED 18284/python3
tcp 0 127.0.0.1:127.0.0.1:ESTABLISHED 4568/python3
tcp 0 127.0.0.1:127.0.0.1:ESTABLISHED –
tcp 0 127.0.0.1:127.0.0.1:ESTABLISHED 4568/python3
你們這些有女友的都弱爆了啦
更新:大家來玩 TCP: 一個(gè)人也可以建立 TCP 連接呢 – 依云’s Blog
2023年08月19日回答 · 2023年08月19日更新
依云21.1k 聲望
答案對人有幫助,有參考價(jià)值1答案沒幫助,是錯(cuò)誤的答案,答非所問
內(nèi)核是以一個(gè)(著名的)5元信息組來標(biāo)識不同的socket的:源地址、源端口、目的地址、目的端口、協(xié)議號。任何一個(gè)不同,都不叫“同一個(gè)socket”。
2023年08月20日回答
sched_yield80 聲望
答案對人有幫助,有參考價(jià)值0答案沒幫助,是錯(cuò)誤的答案,答非所問
首先,TCP鏈接是可靠的端對端的鏈接,每個(gè)TCP鏈接由4個(gè)要素組成:2組IP地址(本地和遠(yuǎn)端),2組端口地址(本地和遠(yuǎn)端)。其中如果需要跟端口信息綁定時(shí),都需要調(diào)用bind函數(shù),如果server端針對2個(gè)同樣的IP、端口組進(jìn)行同樣的綁定時(shí),第2次同樣是不成功的。
2023年08月16日回答
charliecui2.4k 聲望
答案對人有幫助,有參考價(jià)值0答案沒幫助,是錯(cuò)誤的答案,答非所問
有個(gè)相關(guān)的問題: ftp的數(shù)據(jù)傳輸,服務(wù)器會(huì)用20端口主動(dòng)連接客戶端,如果兩個(gè)客戶端同時(shí)在一下載東西,那ftp 服務(wù)器能用20端口去連接兩個(gè)ip ?(這時(shí)ftp的服務(wù)器其實(shí)是tcp里的客戶端)
2023年08月16日回答
編輯
hyanleo163 聲望
+1
能啊,看我的實(shí)驗(yàn)。
依云 · 2023年08月19日
不管是服務(wù)器還是客戶端,建立TCP鏈接,同一個(gè)端口都只能使用一次。
這句話其實(shí)是**錯(cuò)的**!
對于TCP協(xié)議,要成功建立一個(gè)新的鏈接,需要保證新鏈接四個(gè)要素組合體的唯一性:客戶端的IP、客戶端的port、服務(wù)器端的IP、服務(wù)器端的port。也就是說,服務(wù)器端的同一個(gè)IP和port,可以和同一個(gè)客戶端的多個(gè)不同端口成功建立多個(gè)TCP鏈接(與多個(gè)不同的客戶端當(dāng)然也可以),只要保證【Server IP + Server Port + Client IP + Client Port】這個(gè)組合唯一不重復(fù)即可。
> netstat -a -n -p tcp |grep 9999
tcp.0.0.1:.0.0.1:9999 ESTABLISHED 2701/nc
tcp.0.0.1:.0.0.1:9999 ESTABLISHED 2752/nc
上述結(jié)果127.0.0.1:9999中9999端口成功建立兩個(gè)TCP鏈接,也就可以理解。
**客戶端**發(fā)送TCP鏈接請求的端口,也就是后續(xù)建立TCP鏈接使用的端口,所以一旦TCP鏈接建立,端口就被占用,無法再建立第二個(gè)鏈接。
而**服務(wù)器端**有兩類端口:偵聽端口 和 后續(xù)建立TCP鏈接的端口。其中偵聽端口只負(fù)責(zé)偵聽客戶端發(fā)送來的TCP鏈接請求,不用作建立TCP鏈接使用,一旦偵聽到有客戶端發(fā)送TCP鏈接請求,就分配一個(gè)端口(一般隨機(jī)分配,且不會(huì)重復(fù))用于建立TCP鏈接,而不是所說的服務(wù)器一個(gè)端口能建立多個(gè)連接。
上述描述也比較片面,客戶端如何請求及建立鏈接,服務(wù)器端如何偵聽及是否分配新隨機(jī)端口等…應(yīng)該都可以在應(yīng)用層面進(jìn)行控制,所以上述描述可以作為建立TCP鏈接的一種方式,僅供參考。
一些英文的參考:
How do multiple clients connect simultaneously to one port, say 80, on a server?
TCP : two different sockets sharing a port?
提升linux下tcp服務(wù)器并發(fā)連接數(shù)限制:30:23
1、修改用戶進(jìn)程可打開文件數(shù)限制
在Linux平臺上,無論編寫客戶端程序還是服務(wù)端程序,在進(jìn)行高并發(fā)TCP連接處理時(shí),更高的并發(fā)數(shù)量都要受到系統(tǒng)對用戶單一進(jìn)程同時(shí)可打開文件數(shù)量的限制(這是因?yàn)橄到y(tǒng)為每個(gè)TCP連接都要?jiǎng)?chuàng)建一個(gè)socket句柄,每個(gè)socket句柄同時(shí)也是一個(gè)文件句柄)??墒褂胾limit命令查看系統(tǒng)允許當(dāng)前用戶進(jìn)程打開的文件數(shù)限制:
$ ulimit -n
這表示當(dāng)前用戶的每個(gè)進(jìn)程最多允許同時(shí)打開1024個(gè)文件,這1024個(gè)文件中還得除去每個(gè)進(jìn)程必然打開的標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤,服務(wù)器監(jiān)聽 socket,進(jìn)程間通訊的unix域socket等文件,那么剩下的可用于客戶端socket連接的文件數(shù)就只有大概=1014個(gè)左右。也就是說缺省情況下,基于Linux的通訊程序最多允許同時(shí)1014個(gè)TCP并發(fā)連接。
對于想支持更高數(shù)量的TCP并發(fā)連接的通訊處理程序,就必須修改Linux對當(dāng)前用戶的進(jìn)程同時(shí)打開的文件數(shù)量的軟限制(soft limit)和硬限制(hardlimit)。其中軟限制是指Linux在當(dāng)前系統(tǒng)能夠承受的范圍內(nèi)進(jìn)一步限制用戶同時(shí)打開的文件數(shù);硬限制則是根據(jù)系統(tǒng)硬件資源狀況(主要是系統(tǒng)內(nèi)存)計(jì)算出來的系統(tǒng)最多可同時(shí)打開的文件數(shù)量。通常軟限制小于或等于硬限制。
修改上述限制的最簡單的辦法就是使用ulimit命令:
$ ulimit -n
上述命令中,在中指定要設(shè)置的單一進(jìn)程允許打開的更大文件數(shù)。如果系統(tǒng)回顯類似于“Operation notpermitted”之類的話,說明上述限制修改失敗,實(shí)際上是因?yàn)樵谥兄付ǖ臄?shù)值超過了Linux系統(tǒng)對該用戶打開文件數(shù)的軟限制或硬限制。因此,就需要修改Linux系統(tǒng)對用戶的關(guān)于打開文件數(shù)的軟限制和硬限制。
之一步,修改/etc/security/limits.conf文件,在文件中添加如下行:
speng soft nofile 10240
speng hard nofile 10240
其中speng指定了要修改哪個(gè)用戶的打開文件數(shù)限制,可用’*’號表示修改所有用戶的限制;soft或hard指定要修改軟限制還是硬限制;10240則指定了想要修改的新的限制值,即更大打開文件數(shù)(請注意軟限制值要小于或等于硬限制)。修改完后保存文件。
第二步,修改/etc/pam.d/login文件,在文件中添加如下行:
session required /lib/security/pam_limits.so
這是告訴Linux在用戶完成系統(tǒng)登錄后,應(yīng)該調(diào)用pam_limits.so模塊來設(shè)置系統(tǒng)對該用戶可使用的各種資源數(shù)量的更大限制(包括用戶可打開的更大文件數(shù)限制),而pam_limits.so模塊就會(huì)從/etc/security/limits.conf文件中讀取配置來設(shè)置這些限制值。修改完后保存此文件。
第三步,查看Linux系統(tǒng)級的更大打開文件數(shù)限制,使用如下命令:
$ cat /proc/sys/fs/file-max
這表明這臺Linux系統(tǒng)最多允許同時(shí)打開(即包含所有用戶打開文件數(shù)總和)12158個(gè)文件,是Linux系統(tǒng)級硬限制,所有用戶級的打開文件數(shù)限制都不應(yīng)超過這個(gè)數(shù)值。通常這個(gè)系統(tǒng)級硬限制是Linux系統(tǒng)在啟動(dòng)時(shí)根據(jù)系統(tǒng)硬件資源狀況計(jì)算出來的更佳的更大同時(shí)打開文件數(shù)限制,如果沒有特殊需要,不應(yīng)該修改此限制,除非想為用戶級打開文件數(shù)限制設(shè)置超過此限制的值。修改此硬限制的方法是修改/etc/rc.local腳本,在腳本中添加如下行:
echo> /proc/sys/fs/file-max
這是讓Linux在啟動(dòng)完成后強(qiáng)行將系統(tǒng)級打開文件數(shù)硬限制設(shè)置為22158。修改完后保存此文件。
完成上述步驟后重啟系統(tǒng),一般情況下就可以將Linux系統(tǒng)對指定用戶的單一進(jìn)程允許同時(shí)打開的更大文件數(shù)限制設(shè)為指定的數(shù)值。如果重啟后用 ulimit- n命令查看用戶可打開文件數(shù)限制仍然低于上述步驟中設(shè)置的更大值,這可能是因?yàn)樵谟脩舻卿浤_本/etc/profile中使用ulimit-n命令已經(jīng)將用戶可同時(shí)打開的文件數(shù)做了限制。由于通過ulimit-n修改系統(tǒng)對用戶可同時(shí)打開文件的更大數(shù)限制時(shí),新修改的值只能小于或等于上次ulimit-n 設(shè)置的值,因此想用此命令增大這個(gè)限制值是不可能的。所以,如果有上述問題存在,就只能去打開/etc/profile腳本文件,在文件中查找是否使用了 ulimit-n限制了用戶可同時(shí)打開的更大文件數(shù)量,如果找到,則刪除這行命令,或者將其設(shè)置的值改為合適的值,然后保存文件,用戶退出并重新登錄系統(tǒng)即可。
通過上述步驟,就為支持高并發(fā)TCP連接處理的通訊處理程序解除關(guān)于打開文件數(shù)量方面的系統(tǒng)限制。
2、修改網(wǎng)絡(luò)內(nèi)核對TCP連接的有關(guān)限制
在Linux上編寫支持高并發(fā)TCP連接的客戶端通訊處理程序時(shí),有時(shí)會(huì)發(fā)現(xiàn)盡管已經(jīng)解除了系統(tǒng)對用戶同時(shí)打開文件數(shù)的限制,但仍會(huì)出現(xiàn)并發(fā)TCP連接數(shù)增加到一定數(shù)量時(shí),再也無法成功建立新的TCP連接的現(xiàn)象。出現(xiàn)這種現(xiàn)在的原因有多種。
之一種原因可能是因?yàn)長inux網(wǎng)絡(luò)內(nèi)核對本地端口號范圍有限制。此時(shí),進(jìn)一步分析為什么無法建立TCP連接,會(huì)發(fā)現(xiàn)問題出在connect()調(diào)用返回失敗,查看系統(tǒng)錯(cuò)誤提示消息是“Can’t assign requestedaddress”。同時(shí),如果在此時(shí)用tcpdump工具監(jiān)視網(wǎng)絡(luò),會(huì)發(fā)現(xiàn)根本沒有TCP連接時(shí)客戶端發(fā)SYN包的網(wǎng)絡(luò)流量。這些情況說明問題在于本地Linux系統(tǒng)內(nèi)核中有限制。其實(shí),問題的根本原因在于Linux內(nèi)核的TCP/IP協(xié)議實(shí)現(xiàn)模塊對系統(tǒng)中所有的客戶端TCP連接對應(yīng)的本地端口號的范圍進(jìn)行了限制(例如,內(nèi)核限制本地端口號的范圍為1024~32768之間)。當(dāng)系統(tǒng)中某一時(shí)刻同時(shí)存在太多的TCP客戶端連接時(shí),由于每個(gè)TCP客戶端連接都要占用一個(gè)唯一的本地端口號(此端口號在系統(tǒng)的本地端口號范圍限制中),如果現(xiàn)有的TCP客戶端連接已將所有的本地端口號占滿,則此時(shí)就無法為新的TCP客戶端連接分配一個(gè)本地端口號了,因此系統(tǒng)會(huì)在這種情況下在connect()調(diào)用中返回失敗,并將錯(cuò)誤提示消息設(shè)為“Can’t assignrequested address”。有關(guān)這些控制邏輯可以查看Linux內(nèi)核源代碼,以linux2.6內(nèi)核為例,可以查看tcp_ipv4.c文件中如下函數(shù):
static int tcp_v4_hash_connect(struct sock *sk)
請注意上述函數(shù)中對變量sysctl_local_port_range的訪問控制。變量sysctl_local_port_range的初始化則是在tcp.c文件中的如下函數(shù)中設(shè)置:
void __init tcp_init(void)
內(nèi)核編譯時(shí)默認(rèn)設(shè)置的本地端口號范圍可能太小,因此需要修改此本地端口范圍限制。
之一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
net.ipv4.ip_local_port_range =
這表明將系統(tǒng)對本地端口范圍限制設(shè)置為1024~65000之間。請注意,本地端口范圍的最小值必須大于或等于1024;而端口范圍的更大值則應(yīng)小于或等于65535。修改完后保存此文件。
第二步,執(zhí)行sysctl命令:
$ sysctl -p
如果系統(tǒng)沒有錯(cuò)誤提示,就表明新的本地端口范圍設(shè)置成功。如果按上述端口范圍進(jìn)行設(shè)置,則理論上單獨(dú)一個(gè)進(jìn)程最多可以同時(shí)建立60000多個(gè)TCP客戶端連接。
第二種無法建立TCP連接的原因可能是因?yàn)長inux網(wǎng)絡(luò)內(nèi)核的IP_TABLE防火墻對更大跟蹤的TCP連接數(shù)有限制。此時(shí)程序會(huì)表現(xiàn)為在 connect()調(diào)用中阻塞,如同死機(jī),如果用tcpdump工具監(jiān)視網(wǎng)絡(luò),也會(huì)發(fā)現(xiàn)根本沒有TCP連接時(shí)客戶端發(fā)SYN包的網(wǎng)絡(luò)流量。由于 IP_TABLE防火墻在內(nèi)核中會(huì)對每個(gè)TCP連接的狀態(tài)進(jìn)行跟蹤,跟蹤信息將會(huì)放在位于內(nèi)核內(nèi)存中的conntrackdatabase中,這個(gè)數(shù)據(jù)庫的大小有限,當(dāng)系統(tǒng)中存在過多的TCP連接時(shí),數(shù)據(jù)庫容量不足,IP_TABLE無法為新的TCP連接建立跟蹤信息,于是表現(xiàn)為在connect()調(diào)用中阻塞。此時(shí)就必須修改內(nèi)核對更大跟蹤的TCP連接數(shù)的限制,方法同修改內(nèi)核對本地端口號范圍的限制是類似的:
之一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
net.ipv4.ip_conntrack_max = 10240
這表明將系統(tǒng)對更大跟蹤的TCP連接數(shù)限制設(shè)置為10240。請注意,此限制值要盡量小,以節(jié)省對內(nèi)核內(nèi)存的占用。
第二步,執(zhí)行sysctl命令:
$ sysctl -p
如果系統(tǒng)沒有錯(cuò)誤提示,就表明系統(tǒng)對新的更大跟蹤的TCP連接數(shù)限制修改成功。如果按上述參數(shù)進(jìn)行設(shè)置,則理論上單獨(dú)一個(gè)進(jìn)程最多可以同時(shí)建立10000多個(gè)TCP客戶端連接。
3、使用支持高并發(fā)網(wǎng)絡(luò)I/O的編程技術(shù)
在Linux上編寫高并發(fā)TCP連接應(yīng)用程序時(shí),必須使用合適的網(wǎng)絡(luò)I/O技術(shù)和I/O事件分派機(jī)制。
可用的I/O技術(shù)有同步I/O,非阻塞式同步I/O(也稱反應(yīng)式I/O),以及異步I/O。在高TCP并發(fā)的情形下,如果使用同步I/O,這會(huì)嚴(yán)重阻塞程序的運(yùn)轉(zhuǎn),除非為每個(gè)TCP連接的I/O創(chuàng)建一個(gè)線程。但是,過多的線程又會(huì)因系統(tǒng)對線程的調(diào)度造成巨大開銷。因此,在高TCP并發(fā)的情形下使用同步I /O 是不可取的,這時(shí)可以考慮使用非阻塞式同步I/O或異步I/O。非阻塞式同步I/O的技術(shù)包括使用select(),poll(),epoll等機(jī)制。異步I/O的技術(shù)就是使用AIO。
從I/O事件分派機(jī)制來看,使用select()是不合適的,因?yàn)樗С值牟l(fā)連接數(shù)有限(通常在1024個(gè)以內(nèi))。如果考慮性能,poll()也是不合適的,盡管它可以支持的較高的TCP并發(fā)數(shù),但是由于其采用“輪詢”機(jī)制,當(dāng)并發(fā)數(shù)較高時(shí),其運(yùn)行效率相當(dāng)?shù)?,并可能存在I/O事件分派不均,導(dǎo)致部分 TCP連接上的I/O出現(xiàn)“饑餓”現(xiàn)象。而如果使用epoll或AIO,則沒有上述問題(早期 Linux內(nèi)核的AIO技術(shù)實(shí)現(xiàn)是通過在內(nèi)核中為每個(gè)I/O請求創(chuàng)建一個(gè)線程來實(shí)現(xiàn)的,這種實(shí)現(xiàn)機(jī)制在高并發(fā)TCP連接的情形下使用其實(shí)也有嚴(yán)重的性能問題。但在最新的Linux內(nèi)核中,AIO的實(shí)現(xiàn)已經(jīng)得到改進(jìn))。
linux的相關(guān)問題
1 test -d
文件測試
test命令也可以用于檢查文件的狀態(tài)
e 文件存在則為真
r 文件存在并且可讀則為真
w 文件存在并且可寫則為真
x 文件存在并且可執(zhí)行則為真
s 文件存在并且至少有一個(gè)字符則為真
d 文件存在并且為目錄則為真
f 文件存在并且為普通文件則為真
c 文件存在并且為字符型文件則為真
b 文件存在并且為塊特殊文件則為真
a并且 -o或者 !非
2 能為myfile1更新時(shí)間的命令____touch
3 linux中的歸檔解檔命令____tar
4 編譯是優(yōu)先級的取值范圍是:______,默認(rèn)的優(yōu)先級是____
中進(jìn)程的優(yōu)先極是由進(jìn)程的nice值決定的,值越小,優(yōu)先級越高
5 linux中標(biāo)準(zhǔn)設(shè)備文件有哪些.分別用什么符號表示.
—
主設(shè)備號設(shè)備類型
次設(shè)備號=文件名簡要說明
0 未命名設(shè)備(例如:掛載的非設(shè)備)
0 = 未空設(shè)備號保留
1 char 內(nèi)存設(shè)備
1 = /dev/mem 直接存取物理內(nèi)存
2 = /dev/kmem 存取經(jīng)過內(nèi)核虛擬之后的內(nèi)存
3 = /dev/null 空設(shè)備。任何寫入都將被直接丟棄,任何讀取都將得到EOF。
4 = /dev/port 存取 I/O 端口
5 = /dev/zero 零字節(jié)源,只能讀取到無限多的零字節(jié)。
7 = /dev/full 滿設(shè)備。任何寫入都將失敗,并把errno設(shè)為ENOSPC以表示沒有剩余空間。
8 = /dev/random 隨機(jī)數(shù)發(fā)生器。完全由用戶的輸入來產(chǎn)生隨機(jī)數(shù)。
如果用戶停止所有動(dòng)作,則停止產(chǎn)生新的隨機(jī)數(shù)。
9 = /dev/urandom 更快,但是不夠安全的隨機(jī)數(shù)發(fā)生器。盡可能由用戶的輸入來產(chǎn)生隨機(jī)數(shù),
如果用戶停止所有動(dòng)作,則把已經(jīng)產(chǎn)生的隨機(jī)數(shù)做為種子來產(chǎn)生新的隨機(jī)數(shù)。
10 = /dev/aio 異步 I/O 通知接口
11 = /dev/kmsg 任何對該文件的寫入都將作為 printk 的輸出
1 block RAM disk
0 = /dev/ram0 第1個(gè) RAM disk (initrd只能使用ram0)
1 = /dev/ram1 第2個(gè) RAM disk
…
200 = /dev/ram200 第200個(gè) RAM disk
4 char TTY(終端)設(shè)備
0 = /dev/tty0 當(dāng)前虛擬控制臺
1 = /dev/tty1 第1個(gè)虛擬控制臺
…
63 = /dev/tty63 第63個(gè)虛擬控制臺
4 block 如果根文件系統(tǒng)以是以只讀方式掛載的,那么就不可能創(chuàng)建真正的設(shè)備節(jié)點(diǎn),
此時(shí)就使用該設(shè)備作為動(dòng)態(tài)分配的主(major)設(shè)備的別名
0 = /dev/root
5 char 其他 TTY 設(shè)備
0 = /dev/tty 當(dāng)前 TTY 設(shè)備
1 = /dev/console 系統(tǒng)控制臺
2 = /dev/ptmx 所有 PTY master 的復(fù)用器
7 char 虛擬控制臺捕捉設(shè)備(這些設(shè)備既允許讀也允許寫)
0 = /dev/vcs 當(dāng)前虛擬控制臺(vc)的文本內(nèi)容
1 = /dev/vcs1 tty1 的文本內(nèi)容
…
63 = /dev/vcs63 tty63 的文本內(nèi)容
128 = /dev/vcsa 當(dāng)前虛擬控制臺(vc)的文本/屬性內(nèi)容
129 = /dev/vcsa1 tty1 的文本/屬性內(nèi)容
…
191 = /dev/vcsa63 tty63 的文本/屬性內(nèi)容代碼:
7 block 回環(huán)設(shè)備(用一個(gè)普通的磁盤文件來模擬一個(gè)塊設(shè)備)
對回環(huán)設(shè)備的綁定由 mount(8) 或 losetup(8) 處理
0 = /dev/loop0 第1個(gè)回環(huán)設(shè)備
1 = /dev/loop1 第2個(gè)回環(huán)設(shè)備
…
8 block SCSI 磁盤(0-15)
0 = /dev/sda 第1個(gè) SCSI 磁盤(整個(gè)磁盤)
16 = /dev/sdb 第2個(gè) SCSI 磁盤(整個(gè)磁盤)
32 = /dev/sdc 第3個(gè) SCSI 磁盤(整個(gè)磁盤)
…
240 = /dev/sdp 第16個(gè) SCSI 磁盤(整個(gè)磁盤)
分區(qū)表示方法如下(以第3個(gè) SCSI 磁盤為例)
33 = /dev/sdc1 第1個(gè)分區(qū)
34 = /dev/sdc2 第2個(gè)分區(qū)
…
47 = /dev/sdc15 第15個(gè)分區(qū)
對于Linux/i386來說,分區(qū)1-4是主分區(qū),5-15是邏輯分區(qū)。
9 block Metadisk(RAID)設(shè)備
0 = /dev/md0 第1組 metadisk
1 = /dev/md1 第2組 metadisk
…
metadisk 驅(qū)動(dòng)用于將同一個(gè)文件系統(tǒng)分割到多個(gè)物理磁盤上。
10 char 非串口鼠標(biāo),各種雜項(xiàng)設(shè)備和特性
1 = /dev/psaux PS/2鼠標(biāo)
131 = /dev/temperature 機(jī)器內(nèi)部溫度
134 = /dev/apm_bios APM(高級電源管理) BIOS
135 = /dev/rtc 實(shí)時(shí)時(shí)鐘(Real Time Clock)
144 = /dev/nvram 非易失配置 RAM
162 = /dev/bus 系統(tǒng)管理總線(System Management Bus)
164 = /dev/ipmo Intel的智能平臺管理(Intelligent Platform Management)接口
173 = /dev/ipmikcs 智能平臺管理(Intelligent Platform Management)接口
175 = /dev/agpgart AGP圖形地址重映射表(Graphics Address Remapping Table)
182 = /dev/perfctr 性能監(jiān)視計(jì)數(shù)器
183 = /dev/hwrng 通用硬件隨機(jī)數(shù)發(fā)生器
184 = /dev/cpu/microcode CPU微代碼更新接口
186 = /dev/atomicps 進(jìn)程狀態(tài)數(shù)據(jù)的原子快照
188 = /dev/buios Bus(系統(tǒng)管理總線) BIOS
200 = /dev/net/tun TAP/TUN 網(wǎng)絡(luò)設(shè)備(TAP/TUN以軟件的方式實(shí)現(xiàn)了網(wǎng)絡(luò)設(shè)備)
TAP模擬了以太網(wǎng)幀(第二層),TUN模擬了IP包(第三層)。
202 = /dev/emd/ctl 增強(qiáng)型 Metadisk RAID (EMD) 控制器
220 = /dev/mptctl Message passing technology (MPT) control
223 = /dev/input/uinput 用戶層輸入設(shè)備驅(qū)動(dòng)支持
227 = /dev/mcelog X86_64 Machine Check Exception driver
228 = /dev/hpet HPET driver
229 = /dev/fuse Fuse(用戶空間的虛擬文件系統(tǒng))
231 = /dev/snapshot 系統(tǒng)內(nèi)存快照
232 = /dev/kvm 基于內(nèi)核的虛構(gòu)機(jī)(基于AMD SVM和Intel VT硬件虛擬技術(shù))
11 block SCSI CD-ROM 設(shè)備
0 = /dev/scd0 第1個(gè) SCSI CD-ROM
1 = /dev/scd1 第2個(gè) SCSI CD-ROM
…代碼:
13 char 核心輸入設(shè)備
32 = /dev/input/mouse0 第1個(gè)鼠標(biāo)
33 = /dev/input/mouse1 第2個(gè)鼠標(biāo)
…
62 = /dev/input/mouse30 第31個(gè)鼠標(biāo)
63 = /dev/input/mice 所有鼠標(biāo)的統(tǒng)一
64 = /dev/input/event0 第1個(gè)事件隊(duì)列
65 = /dev/input/event1 第2個(gè)事件隊(duì)列
…
95 = /dev/input/event1 第32個(gè)事件隊(duì)列
21 char 通用 SCSI 設(shè)備(通常是SCSI光驅(qū))
0 = /dev/sg0 第1個(gè)通用 SCSI 設(shè)備
1 = /dev/sg1 第2個(gè)通用 SCSI 設(shè)備
…
29 char 通用幀緩沖(frame buffer)設(shè)備
0 = /dev/fb0 第1個(gè)幀緩沖設(shè)備
1 = /dev/fb1 第2個(gè)幀緩沖設(shè)備
…
31 = /dev/fb31 第32個(gè)幀緩沖設(shè)備
30 char iBCS-2 兼容設(shè)備
0 = /dev/socksys 套接字訪問接口
1 = /dev/spx SVR3 本地 X 接口
32 = /dev/inet/ip 網(wǎng)絡(luò)訪問接口
33 = /dev/inet/icmp
34 = /dev/inet/ggp
35 = /dev/inet/ipip
36 = /dev/inet/tcp
37 = /dev/inet/egp
38 = /dev/inet/pup
39 = /dev/inet/udp
40 = /dev/inet/idp
41 = /dev/inet/rawip
此外,iBCS-2 還需要下面的連接必須存在
/dev/ip -> /dev/inet/ip
/dev/icmp -> /dev/inet/icmp
/dev/ggp -> /dev/inet/ggp
/dev/ipip -> /dev/inet/ipip
/dev/tcp -> /dev/inet/tcp
/dev/egp -> /dev/inet/egp
/dev/pup -> /dev/inet/pup
/dev/udp -> /dev/inet/udp
/dev/idp -> /dev/inet/idp
/dev/rawip -> /dev/inet/rawip
/dev/inet/arp -> /dev/inet/udp
/dev/inet/rip -> /dev/inet/udp
/dev/nfsd -> /dev/socksys
/dev/X0R -> /dev/null代碼:
36 char Netlink 支持
0 = /dev/route 路由, 設(shè)備更新, kernel to user
3 = /dev/fwmonitor Firewall packet 復(fù)制
59 char sf 防火墻模塊
0 = /dev/firewall 與 sf 內(nèi)核模塊通信
65 block SCSI 磁盤(16-31)
0 = /dev/sdq 第17個(gè) SCSI 磁盤(整個(gè)磁盤)
16 = /dev/sdr 第18個(gè) SCSI 磁盤(整個(gè)磁盤)
32 = /dev/sds 第19個(gè) SCSI 磁盤(整個(gè)磁盤)
…
240 = /dev/sdaf 第32個(gè) SCSI 磁盤(整個(gè)磁盤)
66 block SCSI 磁盤(32-47)
0 = /dev/sdag 第33個(gè) SCSI 磁盤(整個(gè)磁盤)
16 = /dev/sdah 第34個(gè) SCSI 磁盤(整個(gè)磁盤)
32 = /dev/sdai 第35個(gè) SCSI 磁盤(整個(gè)磁盤)
…
240 = /dev/sdav 第48個(gè) SCSI 磁盤(整個(gè)磁盤)
89 char I2C 總線接口
0 = /dev/i2c-0 第1個(gè) I2C 適配器
1 = /dev/i2c-1 第2個(gè) I2C 適配器
…
98 block 用戶模式下的虛擬塊設(shè)備(分區(qū)處理方式與 SCSI 磁盤相同)
0 = /dev/ubda 第1個(gè)用戶模式塊設(shè)備
16 = /dev/udbb 第2個(gè)用戶模式塊設(shè)備
…
103 block 審計(jì)(Audit)設(shè)備
0 = /dev/audit 審計(jì)(Audit)設(shè)備
char Unix98 PTY master
這些設(shè)備不應(yīng)當(dāng)存在設(shè)備節(jié)點(diǎn),而應(yīng)當(dāng)通過 /dev/ptmx 接口訪問。
char Unix98 PTY slave
這些設(shè)備節(jié)點(diǎn)是自動(dòng)生成的(伴有適當(dāng)?shù)臋?quán)限和模式),不能手動(dòng)創(chuàng)建。
方法是通過使用適當(dāng)?shù)?mount 選項(xiàng)(通常是:mode=0620,gid=)
將 devpts 文件系統(tǒng)掛載到 /dev/pts 目錄即可。
0 = /dev/pts/0 第1個(gè) Unix98 PTY slave
1 = /dev/pts/1 第2個(gè) Unix98 PTY slave
…代碼:
153 block Enhanced Metadisk RAID (EMD) 存儲(chǔ)單元(分區(qū)處理方式與 SCSI 磁盤相同)
0 = /dev/emd/0 第1個(gè)存儲(chǔ)單元
1 = /dev/emd/0p1 第1個(gè)存儲(chǔ)單元的第1個(gè)分區(qū)
2 = /dev/emd/0p2 第1個(gè)存儲(chǔ)單元的第2個(gè)分區(qū)
…
15 = /dev/emd/0p15 第1個(gè)存儲(chǔ)單元的第15個(gè)分區(qū)
16 = /dev/emd/1 第2個(gè)存儲(chǔ)單元
32 = /dev/emd/2 第3個(gè)存儲(chǔ)單元
…
240 = /dev/emd/15 第16個(gè)存儲(chǔ)單元
180 char USB 字符設(shè)備
96 = /dev/u/hiddev0 第1個(gè)USB人機(jī)界面設(shè)備(鼠標(biāo)/鍵盤/游戲桿/手寫版等人操作計(jì)算機(jī)的設(shè)備)
…
111 = /dev/u/hiddev15 第16個(gè)USB人機(jī)界面設(shè)備
180 block USB 塊設(shè)備(U盤之類)
0 = /dev/uba 第1個(gè)USB 塊設(shè)備
8 = /dev/ubb 第2個(gè)USB 塊設(shè)備
16 = /dev/ubc 第3個(gè)USB 塊設(shè)備
…
192 char 內(nèi)核 profiling 接口
0 = /dev/profile Profiling 控制設(shè)備
1 = /dev/profile0 CPU 0 的 Profiling 設(shè)備
2 = /dev/profile1 CPU 1 的 Profiling 設(shè)備
…
193 char 內(nèi)核事件跟蹤接口
0 = /dev/trace 跟蹤控制設(shè)備
1 = /dev/trace0 CPU 0 的跟蹤設(shè)備
2 = /dev/trace1 CPU 1 的跟蹤設(shè)備
…
195 char Nvidia 圖形設(shè)備(比如顯卡)
0 = /dev/nvidia0 第1個(gè) Nvidia 卡
1 = /dev/nvidia1 第2個(gè) Nvidia 卡
…
255 = /dev/nvidiactl Nvidia 卡控制設(shè)備
202 char 特定于CPU模式的寄存器(model-specific register,MSR)
0 = /dev/cpu/0/msr CPU 0 的 MSRs
1 = /dev/cpu/1/msr CPU 1 的 MSRs
…
203 char CPU CPUID 信息
0 = /dev/cpu/0/cpuid CPU 0 的 CPUID
1 = /dev/cpu/1/cpuid CPU 1 的 CPUID
…代碼:
===================================================================
這部分詳細(xì)說明一些應(yīng)該或可能存在于 /dev 目錄之外的文件。
鏈接更好使用與這里完全相同的格式(絕對路徑或相對路徑)。
究竟是使用硬鏈接(hard)還是軟連接(symbolic)取決于不同的設(shè)備。
必須的鏈接
必須在所有的系統(tǒng)上都存在這些連接:
鏈接 目標(biāo) 鏈接類型 簡要說明
/dev/fd /proc/self/fd symbolic 文件描述府
/dev/stdin fd/0 symbolic 標(biāo)準(zhǔn)輸入文件描述府
/dev/stdout fd/1 symbolic 標(biāo)準(zhǔn)輸出文件描述符
/dev/stderr fd/2 symbolic 標(biāo)準(zhǔn)錯(cuò)誤文件描述符
/dev/nfsd socksys symbolic 僅為 iBCS-2 所必須
/dev/X0R null symbolic 僅為 iBCS-2 所必須
/dev/X0R 是 —
推薦的鏈接
推薦在所有的系統(tǒng)上都存在這些連接:
鏈接 目標(biāo) 鏈接類型 簡要說明
/dev/core /proc/kcore symbolic 為了向后兼容
/dev/ramdisk ram0 symbolic 為了向后兼容
/dev/ftape qft0 symbolic 為了向后兼容
/dev/bttv0 video0 symbolic 為了向后兼容
/dev/radio radio0 symbolic 為了向后兼容
/dev/i2o* /dev/i2o/* symbolic 為了向后兼容
/dev/scd? sr? hard 代替 SCSI CD-ROM 的名字
本地定義的鏈接
下面的鏈接很可能需要根據(jù)機(jī)器的實(shí)際硬件配置創(chuàng)建其中的一部分甚至全部。
這些鏈接僅僅是為了迎合習(xí)慣用法,它們既非必須也非推薦。
鏈接 目標(biāo) 鏈接類型 簡要說明
/dev/mouse mouse port symbolic 當(dāng)前鼠標(biāo)
/dev/tape tape device symbolic 當(dāng)前磁帶
/dev/cdrom CD-ROM device symbolic 當(dāng)前CD-ROM
/dev/cdwriter CD-writer symbolic 當(dāng)前CD-writer
/dev/scanner scanner symbolic 當(dāng)前掃描儀
/dev/modem modem port symbolic 當(dāng)前調(diào)制解調(diào)器
/dev/root root device symbolic 當(dāng)前根文件系統(tǒng)所在設(shè)備
/dev/swap swap device symbolic 當(dāng)前swap所在設(shè)備
/dev/modem 不應(yīng)當(dāng)用于能夠同時(shí)支持呼入和呼出的modem,因?yàn)橥鶗?huì)導(dǎo)致鎖文件問題。
如果存在 /dev/modem ,那么它應(yīng)當(dāng)指向一個(gè)恰當(dāng)?shù)闹?TTY 設(shè)備。
對于SCSI設(shè)備,
/dev/tape 和 /dev/cdrom 應(yīng)該分別指向”cooked”設(shè)備 /dev/st* 和 /dev/sr* ;
而 /dev/cdwriter 和 /dev/scanner 應(yīng)當(dāng)分別指向恰當(dāng)?shù)?/dev/sg* 。
/dev/mouse 可以指向一個(gè)主串行 TTY 設(shè)備、一個(gè)硬件鼠標(biāo)、
或者一個(gè)對應(yīng)鼠標(biāo)驅(qū)動(dòng)程序的套接字(例如 /dev/gpmdata)。
套接字和管道
持久套接字和命名管道可以存在于 /dev 中。常見的有:
/dev/printer socket lpd 本地套接字
/dev/log socket syslog 本地套接字
/dev/gpmdata socket gpm 鼠標(biāo)多路復(fù)用器(multiplexer)
/dev/gpmctl socket (LFS-LiveCD中出現(xiàn))
/dev/initctl fifo pipe init 監(jiān)聽它并從中獲取信息(用戶與 init 進(jìn)程交互的通道)
掛載點(diǎn)
以下名稱被保留用于掛載特殊的文件系統(tǒng)。
這些特殊的文件系統(tǒng)只提供內(nèi)核界面而不提供標(biāo)準(zhǔn)的設(shè)備節(jié)點(diǎn)。
/dev/pts devpts PTY slave 文件系統(tǒng)
/dev/shm tmpfs 提供對 POSIX 共享內(nèi)存的直接訪問
linux aio directio的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux aio directio,Linux AIO DirectIO 技術(shù)簡介,linux python connect 對同一個(gè)端口可以建立多少個(gè),linux的相關(guān)問題的信息別忘了在本站進(jìn)行查找喔。
香港云服務(wù)器機(jī)房,創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)云服務(wù)器廠商,回大陸優(yōu)化帶寬,安全/穩(wěn)定/低延遲.創(chuàng)新互聯(lián)助力企業(yè)出海業(yè)務(wù),提供一站式解決方案。香港服務(wù)器-免備案低延遲-雙向CN2+BGP極速互訪!
分享文章:LinuxAIODirectIO技術(shù)簡介(linuxaiodirectio)
標(biāo)題URL:http://www.dlmjj.cn/article/dpcejei.html


咨詢
建站咨詢
