《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #15 ramzswap
HACK #15 ramzswap
本節(jié)介紹將一部分內(nèi)存作為交換設(shè)備使用的ramzswap。
ramzswap是將一部分內(nèi)存空間作為交換設(shè)備使用的基于RAM的塊設(shè)備。對(duì)要換出(swapout)的頁面進(jìn)行壓縮后,不是寫入磁盤,而是寫入內(nèi)存。可以使用的內(nèi)存僅為完成壓縮的部分。壓縮處理使用的是LZO注1。
ramzswap是從Linux 2.6.33合并到Staging驅(qū)動(dòng)程序的。Staging驅(qū)動(dòng)程序是指尚未達(dá)到某種程度的質(zhì)量的試驗(yàn)性驅(qū)動(dòng)程序。
通過使用ramzswap,運(yùn)轉(zhuǎn)速度可以比換出到一般磁盤設(shè)備時(shí)更高。這是因?yàn)閮?nèi)存的I/O較快,且經(jīng)過壓縮后I/O變小。只有用于嵌入式系統(tǒng)的內(nèi)存等的機(jī)器中,可以避免內(nèi)存不足時(shí)由于內(nèi)存回收處理導(dǎo)致性能極端下降,或抑制OOM Killer的運(yùn)行。
ramzswap的項(xiàng)目在如下環(huán)境中,即使減去壓縮/解壓縮的CPU系統(tǒng)開銷,也可以提高性能。
上網(wǎng)本或瘦客戶機(jī)(thin client)這種配備了內(nèi)存容量小但CPU性能較高的的PC。
在組裝機(jī)器上,不想在外部閃存存儲(chǔ)器(flash memory storage)中生成交換區(qū)時(shí)。
使用ramzswap時(shí),可以使用已經(jīng)整合到上游內(nèi)核的,也可以從論壇中下載并使用。
整合到上游內(nèi)核的ramzswap實(shí)際安裝了論壇的部分成果。本節(jié)將針對(duì)上游內(nèi)核和論壇版內(nèi)核進(jìn)行介紹。Linux內(nèi)核以2.6.35為例,論壇數(shù)據(jù)包以版本0.6.2為例。操作系統(tǒng)使用Fedora 12。
使用論壇版ramzswap
使用論壇版的數(shù)據(jù)包時(shí),首先需要下載數(shù)據(jù)包進(jìn)行編譯。由于要對(duì)內(nèi)核模塊進(jìn)行編譯,因此必須事先安裝kernel-devel。
make命令結(jié)束后,將生成內(nèi)核模塊ramzswap.ko和ramzswap設(shè)備的控制工具—rzscontrol命令和rzscontrol命令的manual文件。
小貼士:ramswap版本0.6.2的運(yùn)行已經(jīng)在Linux 2.6.32中確認(rèn)。使用RHEL6編譯時(shí),需要在ramzswap_drv.c的最前面加上#include 。
rzscontrol命令創(chuàng)建的路徑為compcache-0.6.2/sub-projects/rzscontrol/rzscontrol,manual文件創(chuàng)建的路徑為compcache-0.6.2/sub-projects/rzscontrol/man/rzscontrol.1。ramzswap版本0.6.2不會(huì)通過make命令自動(dòng)安裝。可以直接使用這些文件。
ramzswap的使用方法有兩種。一種是在內(nèi)存中創(chuàng)建虛擬交換區(qū)磁盤的ramzswap disk,另一種是在使用內(nèi)存的同時(shí)使用交換文件或交換塊設(shè)備的backing swap。一般系統(tǒng)與使用ramzswap disk、backing swap系統(tǒng)的內(nèi)存和交換區(qū)的關(guān)系如圖2-2所示。
圖2-2 一般系統(tǒng)與使用ramzswap disk、backing swap的系統(tǒng)的內(nèi)存和交換區(qū)的關(guān)系
首先介紹第一個(gè)ramzswap disk。
ramzswap disk的使用方法
使用ramzswap disk,首先需要將用來壓縮/解壓縮數(shù)據(jù)的LZO模塊安裝到內(nèi)核中。
注意事項(xiàng):在部分發(fā)布版(Fedora14等)中,把lzo_decompress模塊靜態(tài)安裝到內(nèi)核中,有時(shí)會(huì)因?yàn)闆]有模塊而導(dǎo)致modprobe失敗。
# modprobe lzo_decompress FATAL:Module lzo_decompress not found.沒有模塊,也沒有靜態(tài)安裝到內(nèi)核時(shí),對(duì)ramzswap.ko執(zhí)行insmod命令,就會(huì)出現(xiàn)如下錯(cuò)誤。
# insmod ramzswap.ko insmod: error inserting 'ramzswap.ko': -1 Unknown symbol in module自己構(gòu)建內(nèi)核時(shí),請(qǐng)將CONFIG_LZO_DECOMPRESS設(shè)置為y或m。把像Fedora 14這樣lzo_decompress靜態(tài)安裝到內(nèi)核的情況下,ramzswap.ko的insmod會(huì)成功。
接下來安裝ramzswap模塊。這里將設(shè)置num_devices=4,以生成4個(gè)設(shè)備文件。
將ramzswap模塊安裝到內(nèi)核的同時(shí),還可以設(shè)置各參數(shù)。下面是設(shè)置作為ramzswap disk使用的內(nèi)存大小的例子。
insmod ramzswap.ko num_devices=4 disksize_kb=20480
只有/dev/ramzswap0的初始化(后面介紹--init選項(xiàng))和disksize_kb參數(shù)設(shè)置是自動(dòng)進(jìn)行的。/dev/ramzswap1~3的初始化和disksize_kb參數(shù)需要另行設(shè)置。
后面也可以在rzscontol命令中設(shè)置相同參數(shù)。但是num_devices只能在安裝模塊時(shí)進(jìn)行設(shè)置。表2-9所示為可設(shè)置的參數(shù)列表。其內(nèi)容將在后面詳細(xì)說明。
表2-9 ramzswap的模塊參數(shù)與rzscontrol命令的選項(xiàng)
安裝ramzswap模塊后,為了作為交換區(qū)使用對(duì)ramzswap設(shè)備進(jìn)行初始化,并啟用交換功能。
# sub-projects/rzscontrol/rzscontrol /dev/ramzswap0 - -init # swapon /dev/ramzswap0這時(shí)也可以使用-p選項(xiàng)指定優(yōu)先級(jí),與已有的交換設(shè)備同時(shí)使用。這個(gè)值較大表示優(yōu)先級(jí)較高,因此應(yīng)當(dāng)指定比一般的交換設(shè)備更大的值。
# swapon -p 100 /dev/ramzswap0 # swapon -s Filename Type Size Used Priority /dev/ramzswap0 partition 511992 0 100 /dev/sda2 partition 2047992 0 -1這時(shí),ramzswap設(shè)備的交換功能就已啟用。使用一定數(shù)量的內(nèi)存后,就會(huì)發(fā)生換出。
可以使用rzscontrol命令的--stats選項(xiàng)來確認(rèn)ramzswap的統(tǒng)計(jì)信息和狀態(tài)。
表2-10為此時(shí)的輸出結(jié)果和各項(xiàng)目的說明。
表2-10 執(zhí)行ramzswap disk命令時(shí)rzscontrol --stats的輸出結(jié)果
由于ramzswap不會(huì)立刻釋放保留的內(nèi)存,因此OrigDataSize和free命令的數(shù)值不一定一致。
rzscontrol命令也可以對(duì)各個(gè)ramzswap設(shè)備進(jìn)行設(shè)置。使用--disksize_kb選項(xiàng)可以設(shè)置ramzswap設(shè)備的大小(單位為千字節(jié))。執(zhí)行下列命令就可以設(shè)置ramzswap設(shè)備的容量。
要將ramzswap設(shè)備排除在交換對(duì)象之外,可以使用swapoff命令。
# swapoff /dev/ramzswap0要關(guān)閉ramzswap,需要在swapoff之后使用rzscontrol命令的--reset選項(xiàng)釋放殘留在ramzswap磁盤中的內(nèi)存。最后將模塊從內(nèi)核中移除。
# sub-projects/rzscontrol/rzscontrol /dev/ramzswap0 --reset # rmmod ramzswapbacking swap的使用方法
ramzswap還有另一種使用方法,就是將部分內(nèi)存作為ramzswap disk使用,再將交換文件或交換塊設(shè)備作為backing swap使用。
ramswap為內(nèi)存和磁盤的兩層。如果內(nèi)存稍有不足,則僅使用內(nèi)存的ramzswap disk進(jìn)行處理,但如果缺少更多內(nèi)存,則頁面的內(nèi)容存放到backing swap中。
下面介紹backing swap的使用方法。
首先與ramzswap disk同樣進(jìn)行設(shè)置。
然后使用rzscontrol命令指定backing swap。
# sub-projects/rzscontrol/rzscontrol /dev/ramzswap0 --init --backing_swap=/dev/sda2 --memlimit_kb=10240使用--backing_swap選項(xiàng)指定交換文件或交換塊設(shè)備。這里指定的是塊設(shè)備/dev/sda2。--memlimit_kb選項(xiàng)指定的是作為ramzswap disk使用的內(nèi)存大小。使用內(nèi)存的方式基本與ramzswap disk相同。沒有指定時(shí)設(shè)置為所有內(nèi)存大小的15%。這里設(shè)置為10240KB。
最后啟用已生成設(shè)備的交換功能。
內(nèi)存使用量一旦增加,首先壓縮的頁面會(huì)寫入ramzswap disk的區(qū)域中。這時(shí)未壓縮到50%以下的頁面則寫入backing swap中,而非ramzswap disk中。另外,超過--memlimit_kb選項(xiàng)指定的內(nèi)存大小時(shí)也會(huì)寫入backing swap中。
表2-11所示為執(zhí)行rzscontrol --stats的結(jié)果。說明中僅記載與ramzswap disk的不同之處。
表2-11 執(zhí)行ramzswap --stats的結(jié)果
使用上游內(nèi)核的ramzswap
要使用安裝在上游內(nèi)核的ramzswap,需要首先啟用內(nèi)核config(CONFIG_RAMZSWAP=y),編譯內(nèi)核。使用make menuconfig命令啟用下列項(xiàng)目。
啟動(dòng)編譯后的內(nèi)核。
使用方法
使用方法與論壇版相同,但需要另外編譯用于上游內(nèi)核的rzscontrol命令。由于上游內(nèi)核驅(qū)動(dòng)程序內(nèi)沒有安裝backing swap,因此必須修改rzscontrol命令的代碼。
上游內(nèi)核中還沒有安裝backing swap和memlimit,因此將這部分代碼從這個(gè)補(bǔ)丁中刪除。下面使用這個(gè)補(bǔ)丁來編譯rzscontrol命令。
按照下列方式指定上游內(nèi)核的include文件進(jìn)行編譯。
# gcc -g -Wall -D_GNU_SOURCE rzscontrol.c -o rzscontrol -I /linux-2.6.35/drivers/staging/ramzswap/ -I../include使用方法與論壇版相同。
小結(jié)
本節(jié)介紹了ramzswap。是否能夠通過壓縮頁面數(shù)據(jù)受益,是與內(nèi)存數(shù)據(jù)的內(nèi)容相關(guān)的。但是即使多少有一些壓縮/解壓縮的系統(tǒng)開銷,也比內(nèi)存耗盡好得多。這在沒有交換區(qū)的無磁盤(diskless)組裝機(jī)器中尤其有效。
參考文獻(xiàn)
compcache Compressed Caching for Linux
http://code.google.com/p/compcache/
LZO1X Compressor from MiniLZO
http://www.oberhumer.com/opensource/lzo/
Compcache: in-memory compressed swapping
http://lwn.net/Articles/334649/
—Naohiro Ooiwa
HACK #16 OOM Killer的運(yùn)行與結(jié)構(gòu)
本節(jié)介紹OOM Killer的運(yùn)行與結(jié)構(gòu)。
Linux中的Out Of Memory(OOM) Killer功能作為確保內(nèi)存的最終手段,可以在耗盡系統(tǒng)內(nèi)存或交換區(qū)后,向進(jìn)程發(fā)送信號(hào),強(qiáng)制終止該進(jìn)程。
這個(gè)功能即使在無法釋放內(nèi)存的情況下,也能夠重復(fù)進(jìn)行確保內(nèi)存的處理過程,防止系統(tǒng)停滯。還可以找出過度消耗內(nèi)存的進(jìn)程。本節(jié)將介紹2.6內(nèi)核的OOM Killer。
確認(rèn)運(yùn)行、日志
進(jìn)行系統(tǒng)驗(yàn)證或負(fù)載試驗(yàn)時(shí),有時(shí)會(huì)出現(xiàn)正在運(yùn)行中的進(jìn)程終止或者SSH連接突然斷開、嘗試重新登錄也無法連接的情況。
這時(shí)需要查看日志。有時(shí)會(huì)輸出如下內(nèi)核信息。
最后出現(xiàn)了Out of memory(內(nèi)存不足)。這就表示OOM Killer已經(jīng)運(yùn)行。無法重新連接的情況就是因?yàn)閟shd被OOM Killer終止。如果不重新啟動(dòng)sshd就無法登錄。
OOM Killer通過終止進(jìn)程來確保空閑內(nèi)存,接下來將介紹如何選定這個(gè)進(jìn)程。
進(jìn)程的選定方法
OOM Killer在內(nèi)存耗盡時(shí),會(huì)查看所有進(jìn)程,并分別為每個(gè)進(jìn)程計(jì)算分?jǐn)?shù)。將信號(hào)發(fā)送給分?jǐn)?shù)最高的進(jìn)程。
計(jì)算分?jǐn)?shù)的方法
在OOM Killer計(jì)算分?jǐn)?shù)時(shí)要考慮很多方面。首先要針對(duì)每個(gè)進(jìn)程確認(rèn)下列1~9個(gè)事項(xiàng)再計(jì)算分?jǐn)?shù)。
1.首先,計(jì)算分?jǐn)?shù)時(shí)是以進(jìn)程的虛擬內(nèi)存大小為基準(zhǔn)的。虛擬內(nèi)存大小可以使用ps命令的VSZ或/proc//status的VmSize注2來確認(rèn)。對(duì)于正在消耗虛擬內(nèi)存的進(jìn)程,其最初的得分較高。單位是將1KB作為1個(gè)得分。消耗1GB內(nèi)存的進(jìn)程,得分約為1 000 000。
2.如果進(jìn)程正在執(zhí)行swapoff系統(tǒng)調(diào)用,則得分設(shè)置為最大值(unsigned long的最大值)。這是因?yàn)榻胹wap的行為與消除內(nèi)存不足是相反的,會(huì)立刻將其作為OOM Killer的對(duì)象進(jìn)程。
3.如果是母進(jìn)程,則將所有子進(jìn)程內(nèi)存大小的一半作為分?jǐn)?shù)。
首先,用得分除以CPU使用時(shí)間(以10秒為單位)的平方根。如果CPU使用時(shí)間為90秒,由于以10秒為單位,因此就是用得分除以9的平方根“3”。另外,根據(jù)進(jìn)程啟動(dòng)開始的時(shí)間也可以調(diào)整得分。用得分除以啟動(dòng)時(shí)間(以1000秒為單位)的平方根的平方根。如果是持續(xù)運(yùn)行16 000秒的進(jìn)程,則用得分除以16的平方根“4”的平方根“2”。越是長(zhǎng)時(shí)間運(yùn)行的進(jìn)程就越重要。
小貼士:雖然源代碼的備注中寫有以10秒為單位、以1000秒為單位,但是實(shí)際上在位運(yùn)算中是以8和1024為單位來計(jì)算。
5.對(duì)于通過nice命令等將優(yōu)先級(jí)設(shè)置得較低的進(jìn)程,要將得分翻倍。nice-n中設(shè)置為1~19的命令的得分翻倍。
6.特權(quán)進(jìn)程普遍較為重要,因此將其得分設(shè)置為1/4。
7.通過capset(3)等設(shè)置了功能(capability)CAP_SYS_RAWIO注3的進(jìn)程,其得分為1/4。將直接對(duì)硬件進(jìn)行操作的進(jìn)程判斷為重要進(jìn)程。
8.關(guān)于Cgroup,如果進(jìn)程只允許與促使OOM Killer運(yùn)行的進(jìn)程所允許的內(nèi)存節(jié)點(diǎn)完全不同的內(nèi)存節(jié)點(diǎn),則其得分為1/8。
9.最后通過proc文件系統(tǒng)oom_adj的值調(diào)整得分。
依據(jù)以上規(guī)則,為所有進(jìn)程打分,向得分最高的進(jìn)程發(fā)送信號(hào)SIGKILL(到Linux 2.6.10為止,在設(shè)置了功能CAP_SYS_RAWIO的情況下,發(fā)送SIGTERM,在沒有設(shè)置的情況下,發(fā)送SIGKILL)。
各進(jìn)程的得分可以使用/proc//oom_score來確認(rèn)。
但是init(PID為1的)進(jìn)程不能成為OOM Killer的對(duì)象。當(dāng)成為對(duì)象的進(jìn)程包含子進(jìn)程時(shí),先向其子進(jìn)程發(fā)送信號(hào)。
向成為對(duì)象的進(jìn)程發(fā)送信號(hào)后,對(duì)于引用系統(tǒng)的全線程,即使線程組(TGID)不同,如果存在與對(duì)象進(jìn)程共享相同內(nèi)存空間的進(jìn)程,則也向這些進(jìn)程發(fā)送信號(hào)。
關(guān)于OOM Killer的proc文件系統(tǒng)
下面開始介紹與OOM Killer相關(guān)的proc文件系統(tǒng)。
/proc//oom_adj
為/proc//oom_adj設(shè)置值就可以調(diào)整得分。調(diào)整值的范圍為–16~15。正的值容易被OOM Killer選定。負(fù)值可能性較低。例如,當(dāng)指定3時(shí),得分就變?yōu)?3倍;當(dāng)指定–5時(shí),得分就變?yōu)?/25。
“–17”是一個(gè)特殊的值。如果設(shè)置為–17,就會(huì)禁止OOM Killer發(fā)出的信號(hào)(從Linux 2.6.12開始支持設(shè)置–17)。
在OOM Killer運(yùn)行的情況下,為了實(shí)現(xiàn)遠(yuǎn)程登錄而想要將sshd排除在對(duì)象外時(shí),可以執(zhí)行下列命令。
從Linux 2.6.18開始可以使用/proc//oom_adj。內(nèi)容記載在Documentation /filesystems/proc.txt中。
/proc/sys/vm/panic_on_oom
將/proc/sys/vm/panic_on_oom設(shè)置為1時(shí),在OOM Killer運(yùn)行時(shí)可以不發(fā)送進(jìn)程信號(hào),而是使內(nèi)核產(chǎn)生重大故障。
從Linux 2.6.24開始proc文件系統(tǒng)就有oom_kill_allocating_task。如果對(duì)此設(shè)置除0以外的值,則促使OOM Killer運(yùn)行的進(jìn)程自身將接收信號(hào)。此處省略對(duì)所有進(jìn)程的得分計(jì)算過程。
# echo 1 > /proc/sys/vm/oom_kill_allocating_task這樣就不需要參照所有進(jìn)程,但是也不會(huì)考慮進(jìn)程的優(yōu)先級(jí)和root權(quán)限等,只發(fā)送信號(hào)。
/proc/sys/vm/oom_dump_tasks
從Linux 2.6.25開始,將oom_dump_tasks設(shè)置為除0以外的值時(shí),在OOM Killer運(yùn)行時(shí)的輸出中會(huì)增加進(jìn)程的列表信息。
下面為設(shè)置示例。
列表信息顯示如下,可以使用dmesg或syslog來確認(rèn)。
[ pid ] uid tgid total_vm rss cpu oom_adj name [ 1] 0 1 2580 1 0 0 init [ 500] 0 500 3231 0 1 -17 udevd [ 2736] 0 2736 1470 1 0 0 syslogd [ 2741] 0 2741 944 0 0 0 klogd [ 2765] 81 2765 5307 0 0 0 dbus-daemon [ 2861] 0 2861 944 0 0 0 acpid ... [ 3320] 0 3320 525842 241215 1 0 stress /proc/<PID>/oom_score_adj從Linux 2.6.36開始都安裝了/proc//oom_score_adj,此后將替換為/proc/ /oom_adj。詳細(xì)內(nèi)容請(qǐng)參考Documentation/feature-removal-schedules.txt。即使當(dāng)前是對(duì)/proc//oom_adj進(jìn)行的設(shè)置,在內(nèi)核內(nèi)部進(jìn)行變換后的值也是針對(duì)/proc//oom_score_adj設(shè)置的。
/proc//oom_score_adj可以設(shè)置–1000~1000之間的值。設(shè)置為–1000時(shí),該進(jìn)程就被排除在OOM Killer強(qiáng)制終止的對(duì)象外。
在內(nèi)核2.6.36以后的版本中寫入oom_adj,只會(huì)輸出一次如下的信息。
RHEL5的特征
在RHEL5中運(yùn)行OOM Killer時(shí)要比在上游內(nèi)核中更加慎重。OOM Killer會(huì)計(jì)算調(diào)用的次數(shù),僅在一定時(shí)間段內(nèi)超出調(diào)用一定次數(shù)的情況下運(yùn)行。
1.OOM Killer從上次調(diào)出到下一次調(diào)出之間超過5秒時(shí),調(diào)用次數(shù)重新開始計(jì)算。這是為了避免僅因?yàn)楫a(chǎn)生突發(fā)性的內(nèi)存負(fù)載就終止進(jìn)程。
2.在計(jì)數(shù)變成0后的1秒以內(nèi)調(diào)出時(shí),不計(jì)入調(diào)用的次數(shù)。
3.OOM Killer的調(diào)用次數(shù)不足10次時(shí),實(shí)際不會(huì)運(yùn)行。OOM Killer調(diào)用10次時(shí)才開始認(rèn)為內(nèi)存不足。
4.最后OOM Killer運(yùn)行不到5秒的話,OOM Killer不會(huì)再次運(yùn)行。因此運(yùn)行頻率最高也有5秒一次。這是為了防止不必要地連續(xù)終止多個(gè)進(jìn)程。也有等待接收到OOM Killer發(fā)出信號(hào)的進(jìn)程終止(釋放內(nèi)存)的意思。
也就是說,只有在OOM Killer在5秒以內(nèi)調(diào)出的狀態(tài)連續(xù)出現(xiàn)10次以上時(shí)才會(huì)運(yùn)行。
這些限制原本是到Linux 2.6.10為止都有的。因此在基于Linux 2.6.9的RHEL4中也需要實(shí)施這些限制。當(dāng)前的上游內(nèi)核中已經(jīng)取消了這些限制。
RHEL4的運(yùn)行
查看OOM Killer在RHEL4(Linux 2.6.9)中的運(yùn)行情況。在下例中,是內(nèi)存、交換區(qū)都為2GB的環(huán)境下,使用負(fù)載測(cè)試工具stress刻意消耗內(nèi)存。
stress是給內(nèi)存、CPU、磁盤I/O施加負(fù)載的工具。既可以為其中一項(xiàng)增加負(fù)載,也可以同時(shí)為這三項(xiàng)中的幾項(xiàng)增加負(fù)載。stress在運(yùn)行中如果接收到信號(hào),就會(huì)輸出信息并終止。
在上游內(nèi)核中無法禁用OOM Killer,而在RHEL4中則通過/proc/sys/vm/oom-kill可以禁用OOM Killer。
# echo 0 > /proc/sys/vm/oom-kill或者
# /sbin/sysctl -w vm.oom-kill=0禁用后OOM Killer就不會(huì)發(fā)送信號(hào),但是會(huì)輸出如上內(nèi)存信息。
RHEL5的運(yùn)行
在RHEL5(Linux 2.6.18)中對(duì)OOM Killer的運(yùn)行進(jìn)行確認(rèn)的方法與RHEL4中相同。
此時(shí)的控制臺(tái)畫面如下所示。添加了運(yùn)行OOM Killer時(shí)的回溯輸出,便于調(diào)試。
Call Trace:
RHEL6的運(yùn)行
RHEL6.0中OOM Killer計(jì)算得分的方式基本和RHEL5中沒有不同。RHEL6系不會(huì)如“RHEL5的特征”中所述慎重地運(yùn)行。其運(yùn)行基本與上游內(nèi)核相同。
小結(jié)
本節(jié)介紹了OOM Killer的結(jié)構(gòu)和各種設(shè)置。當(dāng)系統(tǒng)運(yùn)行異常時(shí)確認(rèn)syslog等,如果有OOM Killer的輸出,就可以得知曾出現(xiàn)內(nèi)存不足。
參考文獻(xiàn)
stress
http://weather.ou.edu/~apw/projects/stress/
—Naohiro Ooiwa
轉(zhuǎn)載于:https://www.cnblogs.com/tcicy/p/8552721.html
總結(jié)
以上是生活随笔為你收集整理的《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #15 ramzswap的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是MES系统?本文解释得很清楚了
- 下一篇: linux下使用ffmpeg下载m3u8