Linux調(diào)整系統(tǒng)最大文件打開數(shù)限制的實(shí)戰(zhàn)指南
引言
在現(xiàn)代高并發(fā)服務(wù)架構(gòu)中,Linux系統(tǒng)的文件描述符(File Descriptor)管理能力直接決定了應(yīng)用的穩(wěn)定性和吞吐量。特別是對(duì)于Java應(yīng)用而言——無論是Tomcat、Netty、Spring Boot還是自研RPC框架——一旦遭遇“Too many open files”錯(cuò)誤,輕則請(qǐng)求失敗,重則服務(wù)崩潰。本文將帶你深入理解Linux文件描述符機(jī)制,手把手教你如何正確調(diào)整系統(tǒng)最大文件打開數(shù)限制,并結(jié)合真實(shí)Java代碼示例,讓你的應(yīng)用穩(wěn)如泰山!
什么是文件描述符?為什么它如此重要?
在Linux系統(tǒng)中,一切皆文件(Everything is a file)。這不僅包括普通文件、目錄,還包括網(wǎng)絡(luò)套接字(Socket)、管道(Pipe)、設(shè)備等。每當(dāng)一個(gè)進(jìn)程打開一個(gè)“文件”,內(nèi)核就會(huì)為其分配一個(gè)文件描述符(File Descriptor, FD),它本質(zhì)上是一個(gè)非負(fù)整數(shù),用于標(biāo)識(shí)該進(jìn)程所打開的資源。
// 示例:Java中打開一個(gè)Socket連接,會(huì)占用一個(gè)FD
Socket socket = new Socket("example.com", 80);
// 此時(shí)系統(tǒng)為該Java進(jìn)程分配了一個(gè)新的文件描述符文件描述符是有限資源。每個(gè)進(jìn)程默認(rèn)只能打開1024個(gè)文件描述符(具體值因發(fā)行版而異)。對(duì)于高并發(fā)Java服務(wù),比如一個(gè)Web服務(wù)器同時(shí)處理數(shù)千個(gè)HTTP連接,很容易就達(dá)到上限。
當(dāng)你看到 java.io.IOException: Too many open files 異常時(shí),就是系統(tǒng)在告訴你:“兄弟,你的FD用完了!”
文件描述符使用情況可視化分析
讓我們先通過一個(gè)簡(jiǎn)單的mermaid圖表,直觀理解文件描述符在系統(tǒng)中的層級(jí)結(jié)構(gòu):

這個(gè)圖展示了從系統(tǒng)全局限制到單個(gè)Java線程所持FD的層級(jí)關(guān)系。接下來我們將逐層剖析并提供調(diào)優(yōu)方案。
如何查看當(dāng)前系統(tǒng)的FD限制?
在動(dòng)手調(diào)整之前,我們首先要學(xué)會(huì)“診斷”。以下是幾個(gè)關(guān)鍵命令:
查看系統(tǒng)級(jí)最大文件數(shù)限制
cat /proc/sys/fs/file-max # 輸出示例:3263487
這個(gè)值表示整個(gè)系統(tǒng)允許打開的最大文件描述符總數(shù)。
查看當(dāng)前用戶的軟硬限制
ulimit -Sn # 軟限制(soft limit) ulimit -Hn # 硬限制(hard limit)
軟限制是實(shí)際生效的限制,硬限制是軟限制的上限。普通用戶只能在軟限制范圍內(nèi)調(diào)整,要突破硬限制需要root權(quán)限。
查看某Java進(jìn)程當(dāng)前使用的FD數(shù)量
假設(shè)你的Java進(jìn)程PID是12345:
ls -l /proc/12345/fd | wc -l # 或者更精確地: lsof -p 12345 | wc -l
實(shí)時(shí)監(jiān)控系統(tǒng)FD使用總量
cat /proc/sys/fs/file-nr # 輸出三個(gè)數(shù)字:已分配FD數(shù) 已分配但未使用FD數(shù) 系統(tǒng)最大FD數(shù)
四步走:永久調(diào)整系統(tǒng)FD限制
調(diào)整分為兩個(gè)層面:系統(tǒng)全局配置 和 用戶/進(jìn)程級(jí)配置。我們推薦兩者結(jié)合,確保萬無一失。
第一步:修改系統(tǒng)級(jí)最大文件數(shù)(需root)
編輯 /etc/sysctl.conf:
sudo vim /etc/sysctl.conf
添加或修改以下行:
fs.file-max = 10000000
然后執(zhí)行:
sudo sysctl -p
立即生效,無需重啟。
建議設(shè)置為物理內(nèi)存KB數(shù)的1~2倍。例如32GB內(nèi)存 → 3210241024 ≈ 3355萬,這里設(shè)1000萬是保守且安全的。
第二步:修改用戶級(jí)軟硬限制(需root)
編輯 /etc/security/limits.conf:
sudo vim /etc/security/limits.conf
在文件末尾添加(假設(shè)運(yùn)行Java的是 appuser 用戶):
appuser soft nofile 65536 appuser hard nofile 65536 * soft nofile 65536 * hard nofile 65536
* 表示對(duì)所有用戶生效。如果你知道確切用戶名,建議指定,避免影響系統(tǒng)其他服務(wù)。
注意:某些系統(tǒng)(如Ubuntu)可能還需要修改 /etc/systemd/system.conf 和 /etc/systemd/user.conf 中的 DefaultLimitNOFILE。
第三步:為systemd服務(wù)單獨(dú)配置(如Java以服務(wù)方式運(yùn)行)
如果你的Java應(yīng)用是通過systemd啟動(dòng)的(如 systemctl start myapp),還需額外配置:
創(chuàng)建或編輯服務(wù)覆蓋文件:
sudo systemctl edit my-java-app.service
添加:
[Service] LimitNOFILE=65536
然后重新加載并重啟服務(wù):
sudo systemctl daemon-reload sudo systemctl restart my-java-app.service
第四步:驗(yàn)證配置是否生效
重啟終端或重新登錄用戶后,執(zhí)行:
ulimit -n # 應(yīng)輸出 65536 # 啟動(dòng)Java程序后,檢查其FD限制 cat /proc/$(pgrep -f YourMainClass)/limits | grep "Max open files"
如果顯示 65536,恭喜你,配置成功!
Java代碼實(shí)戰(zhàn):模擬高并發(fā)場(chǎng)景下的FD耗盡與優(yōu)化
下面我們編寫一個(gè)Java程序,模擬在未調(diào)整FD限制的情況下,如何快速觸發(fā)“Too many open files”錯(cuò)誤;然后再展示優(yōu)化后的健壯版本。
錯(cuò)誤示范:不關(guān)閉資源導(dǎo)致FD泄漏
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class BadClient {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(100);
// 模擬發(fā)起大量連接,但不關(guān)閉Socket
for (int i = 0; i < 2000; i++) {
final int id = i;
executor.submit(() -> {
try {
Socket socket = new Socket("httpbin.org", 80);
System.out.println("Client " + id + " connected. FD used.");
// 故意不關(guān)閉socket!模擬資源泄漏
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
});
}
executor.shutdown();
while (!executor.isTerminated()) {
Thread.sleep(100);
}
}
}運(yùn)行此程序,你很快會(huì)看到:
java.net.SocketException: Too many open files at java.base/java.net.Socket.createImpl(Socket.java:462) at java.base/java.net.Socket.getImpl(Socket.java:522) at java.base/java.net.Socket.getOutputStream(Socket.java:944) ...
這就是典型的FD耗盡異常!
正確做法:使用try-with-resources自動(dòng)關(guān)閉
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class GoodClient {
private static final AtomicInteger successCount = new AtomicInteger(0);
private static final AtomicInteger errorCount = new AtomicInteger(0);
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(200);
for (int i = 0; i < 10000; i++) { // 嘗試1萬個(gè)連接
final int id = i;
executor.submit(() -> {
try {
// 使用 try-with-resources 自動(dòng)關(guān)閉資源
try (Socket socket = new Socket("httpbin.org", 80);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
out.println("GET / HTTP/1.1");
out.println("Host: httpbin.org");
out.println("Connection: close");
out.println();
String line;
while ((line = in.readLine()) != null) {
// 只讀一行響應(yīng)頭即可
if (line.isEmpty()) break;
}
int count = successCount.incrementAndGet();
if (count % 1000 == 0) {
System.out.println("? 成功完成 " + count + " 次連接");
}
}
} catch (Exception e) {
int count = errorCount.incrementAndGet();
if (count <= 10) { // 只打印前10個(gè)錯(cuò)誤
System.err.println("? Client " + id + " failed: " + e.getMessage());
}
}
});
}
executor.shutdown();
while (!executor.isTerminated()) {
Thread.sleep(100);
}
System.out.println("\n?? 最終統(tǒng)計(jì):成功=" + successCount.get() + ", 失敗=" + errorCount.get());
}
}這段代碼的關(guān)鍵改進(jìn):
- ? 使用
try-with-resources語法確保Socket和流被自動(dòng)關(guān)閉。 - ? 控制并發(fā)線程數(shù)(200),避免瞬間沖擊。
- ? 添加計(jì)數(shù)器和日志,便于觀察執(zhí)行狀態(tài)。
即使你將循環(huán)次數(shù)提高到10萬次,只要系統(tǒng)FD限制足夠(我們前面已設(shè)為65536),程序也能穩(wěn)定運(yùn)行!
連接池優(yōu)化:進(jìn)一步減少FD開銷
對(duì)于生產(chǎn)環(huán)境,我們不應(yīng)每次都新建Socket連接。推薦使用連接池技術(shù),復(fù)用已有連接。
下面是一個(gè)基于Apache HttpClient的連接池示例:
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class PooledHttpClientExample {
public static void main(String[] args) throws Exception {
// 創(chuàng)建連接池管理器
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(1000); // 最大總連接數(shù)
cm.setDefaultMaxPerRoute(200); // 每個(gè)路由默認(rèn)最大連接數(shù)
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
ExecutorService executor = Executors.newFixedThreadPool(50);
AtomicInteger counter = new AtomicInteger(0);
for (int i = 0; i < 5000; i++) {
executor.submit(() -> {
try {
HttpGet request = new HttpGet("https://httpbin.org/get");
try (CloseableHttpResponse response = httpClient.execute(request)) {
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity);
// System.out.println(result.substring(0, 50) + "...");
}
int c = counter.incrementAndGet();
if (c % 500 == 0) {
System.out.println("? 完成第 " + c + " 次請(qǐng)求");
}
}
} catch (Exception e) {
e.printStackTrace();
}
});
}
executor.shutdown();
while (!executor.isTerminated()) {
Thread.sleep(100);
}
httpClient.close(); // 關(guān)閉連接池
System.out.println("?? 所有請(qǐng)求完成!");
}
}在這個(gè)例子中:
- 我們只創(chuàng)建了最多1000個(gè)TCP連接(由連接池管理),而不是5000個(gè)。
- 連接被多個(gè)線程復(fù)用,極大減少了FD的創(chuàng)建與銷毀開銷。
- 即使請(qǐng)求數(shù)很大,F(xiàn)D使用量也保持平穩(wěn)。
生產(chǎn)建議:對(duì)于數(shù)據(jù)庫(kù)連接、Redis客戶端、HTTP客戶端等,務(wù)必使用成熟的連接池庫(kù)(如HikariCP、JedisPool、OkHttp等)。
監(jiān)控與告警:防患于未然
調(diào)整完系統(tǒng)參數(shù)只是第一步。我們還需要建立監(jiān)控機(jī)制,提前發(fā)現(xiàn)FD使用異常。
方法一:Shell腳本監(jiān)控
#!/bin/bash
# check_fd.sh
PID=$1
WARN_THRESHOLD=50000
CRIT_THRESHOLD=60000
if [ -z "$PID" ]; then
echo "Usage: $0 <pid>"
exit 1
fi
if ! kill -0 $PID 2>/dev/null; then
echo "? PID $PID 不存在或無權(quán)限訪問"
exit 2
fi
FD_COUNT=$(ls -l /proc/$PID/fd 2>/dev/null | wc -l)
echo "?? 進(jìn)程 $PID 當(dāng)前FD數(shù)量: $FD_COUNT"
if [ $FD_COUNT -gt $CRIT_THRESHOLD ]; then
echo "?? CRITICAL: FD數(shù)量超過閾值 $CRIT_THRESHOLD"
exit 2
elif [ $FD_COUNT -gt $WARN_THRESHOLD ]; then
echo "?? WARNING: FD數(shù)量接近閾值 $WARN_THRESHOLD"
exit 1
else
echo "? OK: FD使用正常"
exit 0
fi
配合cron定時(shí)任務(wù)或Prometheus Node Exporter使用,實(shí)現(xiàn)自動(dòng)化監(jiān)控。
方法二:Java內(nèi)置監(jiān)控(JMX)
我們也可以在Java程序內(nèi)部暴露FD使用指標(biāo):
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.reflect.Method;
import java.nio.file.Files;
import java.nio.file.Paths;
public class FDUsageMonitor implements Runnable {
private final String processName;
public FDUsageMonitor(String name) {
this.processName = name;
}
@Override
public void run() {
try {
long pid = ProcessHandle.current().pid();
String fdPath = "/proc/" + pid + "/fd";
long fdCount = Files.list(Paths.get(fdPath)).count();
OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
double loadAvg = getSystemLoadAverage(osBean);
System.out.printf(
"[%s] PID=%d, FD=%d, Load=%.2f%n",
processName, pid, fdCount, loadAvg
);
// 如果FD超過閾值,記錄日志或發(fā)送告警
if (fdCount > 50000) {
System.err.println("?? FD使用過高!考慮擴(kuò)容或排查泄漏");
}
} catch (Exception e) {
e.printStackTrace();
}
}
private double getSystemLoadAverage(OperatingSystemMXBean osBean) {
try {
Method method = osBean.getClass().getMethod("getSystemLoadAverage");
return (double) method.invoke(osBean);
} catch (Exception e) {
return -1.0;
}
}
public static void main(String[] args) throws InterruptedException {
FDUsageMonitor monitor = new FDUsageMonitor("MyApp");
// 每10秒打印一次
while (true) {
monitor.run();
Thread.sleep(10000);
}
}
}將此類集成到你的應(yīng)用中,可以實(shí)時(shí)掌握FD使用趨勢(shì)。
高級(jí)話題:容器環(huán)境下的FD限制
如今很多Java應(yīng)用運(yùn)行在Docker或Kubernetes中。容器環(huán)境有自己的一套限制機(jī)制。
Docker中設(shè)置ulimit
# Dockerfile FROM openjdk:17-jdk-slim COPY app.jar /app.jar # 設(shè)置容器內(nèi)ulimit CMD ["sh", "-c", "ulimit -n 65536 && java -jar /app.jar"]
或者在運(yùn)行時(shí)指定:
docker run --ulimit nofile=65536:65536 my-java-app
Kubernetes Pod級(jí)別設(shè)置
apiVersion: v1
kind: Pod
metadata:
name: java-app-pod
spec:
containers:
- name: java-app
image: my-java-app:latest
resources:
limits:
memory: "2Gi"
cpu: "1"
securityContext:
runAsUser: 1000
# 設(shè)置Pod級(jí)別的ulimit(需啟用特性門控)
# 注:原生K8s不直接支持ulimit,通常通過initContainer或宿主機(jī)配置解決在K8s中,更常見的做法是在Node節(jié)點(diǎn)上預(yù)先配置好ulimit,或使用特權(quán)容器執(zhí)行sysctl調(diào)整。
壓力測(cè)試:驗(yàn)證你的調(diào)優(yōu)成果
使用Apache Bench (ab) 或 wrk 對(duì)你的Java服務(wù)進(jìn)行壓力測(cè)試:
# 安裝ab(Ubuntu) sudo apt install apache2-utils # 發(fā)起10萬請(qǐng)求,1000并發(fā) ab -n 100000 -c 1000 http://localhost:8080/api/health
同時(shí)在另一個(gè)終端監(jiān)控FD使用:
watch -n 1 'ls -l /proc/$(pgrep -f YourApp)/fd 2>/dev/null | wc -l'
你應(yīng)該能看到FD數(shù)量在某個(gè)穩(wěn)定值上下波動(dòng),而不是持續(xù)增長(zhǎng)——這說明連接被正確復(fù)用和釋放。
故障排查清單
當(dāng)遇到“Too many open files”時(shí),請(qǐng)按以下順序排查:
- ? 是否已按本文方法調(diào)整系統(tǒng)和用戶級(jí)ulimit?
- ? Java進(jìn)程是否繼承了正確的limit?(檢查
/proc/<pid>/limits) - ? 是否存在資源泄漏?(Socket、FileInputStream、ResultSet等未關(guān)閉)
- ? 是否使用了連接池?連接池大小是否合理?
- ? 是否有第三方庫(kù)或中間件(如Log4j、數(shù)據(jù)庫(kù)驅(qū)動(dòng))導(dǎo)致FD泄漏?
- ? 是否在容器環(huán)境中?容器是否繼承了宿主機(jī)的ulimit?
- ? 是否達(dá)到系統(tǒng)級(jí)
fs.file-max上限?(cat /proc/sys/fs/file-nr)
學(xué)習(xí)延伸:深入理解Linux資源限制機(jī)制
Linux的資源限制功能由PAM(Pluggable Authentication Modules)模塊 pam_limits.so 實(shí)現(xiàn)。當(dāng)你登錄系統(tǒng)時(shí),該模塊會(huì)讀取 /etc/security/limits.conf 并應(yīng)用相應(yīng)限制。
此外,還有 prlimit 命令可以動(dòng)態(tài)調(diào)整運(yùn)行中進(jìn)程的限制:
# 查看某進(jìn)程的FD限制 prlimit --pid 12345 --nofile # 動(dòng)態(tài)調(diào)整(需權(quán)限) sudo prlimit --pid 12345 --nofile=65536:65536
這對(duì)于線上緊急擴(kuò)容非常有用!
總結(jié):穩(wěn)健之道,在于未雨綢繆
文件描述符雖小,卻關(guān)乎服務(wù)生死。作為Java開發(fā)者,我們不僅要寫好業(yè)務(wù)代碼,更要理解底層系統(tǒng)機(jī)制。通過本文的學(xué)習(xí),你應(yīng)該已經(jīng)掌握:
- ? Linux FD的基本概念與重要性
- ? 如何查看和調(diào)整系統(tǒng)/用戶級(jí)FD限制
- ? Java中正確管理資源的最佳實(shí)踐
- ? 使用連接池降低FD開銷
- ? 監(jiān)控與告警機(jī)制的建立
- ? 容器環(huán)境下的特殊考量
記住:不要等到線上故障才想起調(diào)優(yōu)! 在項(xiàng)目初期就做好容量規(guī)劃和系統(tǒng)配置,才能讓你的服務(wù)在流量洪峰中屹立不倒。
附錄:完整配置參考模板
/etc/sysctl.conf
# 最大文件描述符總數(shù) fs.file-max = 10000000 # 網(wǎng)絡(luò)相關(guān)優(yōu)化(可選) net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535
/etc/security/limits.conf
# Java應(yīng)用用戶 appuser soft nofile 65536 appuser hard nofile 65536 # 所有用戶 * soft nofile 65536 * hard nofile 65536 # root用戶 root soft nofile 65536 root hard nofile 65536
systemd服務(wù)配置(/etc/systemd/system/myapp.service.d/override.conf)
[Service] LimitNOFILE=65536 User=appuser Group=appuser
常見問題解答(FAQ)
Q:為什么我改了limits.conf但Java進(jìn)程還是1024?
A:很可能是因?yàn)槟阃ㄟ^SSH登錄后沒有重新登錄,或者Java是通過systemd啟動(dòng)的。請(qǐng)確認(rèn)使用 su - username 完全切換用戶,或配置systemd服務(wù)限制。
Q:設(shè)置太大會(huì)不會(huì)浪費(fèi)內(nèi)存?
A:不會(huì)。FD限制只是“上限”,實(shí)際內(nèi)存消耗取決于真正打開的文件數(shù)量。內(nèi)核按需分配數(shù)據(jù)結(jié)構(gòu)。
Q:Docker容器內(nèi)如何永久生效?
A:在Dockerfile中使用 RUN ulimit -n 65536 是無效的,因?yàn)閡limit是shell內(nèi)置命令。應(yīng)在啟動(dòng)命令中設(shè)置,或構(gòu)建基礎(chǔ)鏡像時(shí)修改 /etc/security/limits.conf。
Q:Java有沒有辦法在代碼里設(shè)置ulimit?
A:不能。ulimit是進(jìn)程級(jí)別的系統(tǒng)調(diào)用,必須在JVM啟動(dòng)前由父進(jìn)程設(shè)置。Java程序無法自行提升限制。
彩蛋:一鍵檢測(cè)腳本
保存以下腳本為 fd-check.sh,一鍵診斷你的系統(tǒng)和Java進(jìn)程:
#!/bin/bash
echo "?? 開始FD健康檢查..."
echo "1. 系統(tǒng)最大FD數(shù):"
cat /proc/sys/fs/file-max
echo "2. 當(dāng)前用戶FD限制:"
ulimit -Sn
ulimit -Hn
echo "3. 系統(tǒng)當(dāng)前FD使用情況:"
cat /proc/sys/fs/file-nr
JAVA_PID=$(pgrep -f "java.*YourMainClass" | head -1)
if [ ! -z "$JAVA_PID" ]; then
echo "4. Java進(jìn)程(PID=$JAVA_PID) FD限制:"
cat /proc/$JAVA_PID/limits | grep "open files"
echo "5. Java進(jìn)程當(dāng)前FD數(shù)量:"
ls -l /proc/$JAVA_PID/fd 2>/dev/null | wc -l
else
echo "?? 未找到Java進(jìn)程,請(qǐng)手動(dòng)指定PID"
fi
echo "? 檢查完畢。"
至此,你已掌握Linux文件描述符調(diào)優(yōu)的全套技能!快去給你的Java服務(wù)加上這層“防護(hù)甲”吧!?????
編程不僅是邏輯的藝術(shù),更是與操作系統(tǒng)共舞的哲學(xué)。愿你的每一行代碼,都能在堅(jiān)實(shí)的系統(tǒng)基石上,綻放光彩。
以上就是Linux調(diào)整系統(tǒng)最大文件打開數(shù)限制的實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Linux調(diào)整最大文件打開數(shù)限制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Linux之如何設(shè)置CPU Performance模式
這篇文章主要介紹了Linux之如何設(shè)置CPU Performance模式問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Linux Shell echo命令/printf命令/test命令使用及說明
本文介紹了Linux常用的echo、printf和test命令的用法和功能,對(duì)字符串輸出、格式化顯示以及條件測(cè)試進(jìn)行了簡(jiǎn)明講解,并提供了相關(guān)示例,適合腳本編寫參考2025-10-10
Linux中部署MeterSphere實(shí)現(xiàn)遠(yuǎn)程訪問
MeterSphere是一站式開源持續(xù)測(cè)試平臺(tái), 涵蓋測(cè)試跟蹤、接口測(cè)試、UI 測(cè)試和性能測(cè)試等功能,全面兼容 JMeter、Selenium 等主流開源標(biāo)準(zhǔn),有效助力開發(fā)和測(cè)試團(tuán)隊(duì)充分利用云彈性進(jìn)行高度可擴(kuò)展的自動(dòng)化測(cè)試,2023-10-10
本文介紹Linux中部署MeterSphere實(shí)現(xiàn)遠(yuǎn)程訪問MeterSphere界面
詳解Ubuntu 16.04 pycharm設(shè)置桌面快捷啟動(dòng)方式
本篇文章主要介紹了Ubuntu 16.04 pycharm設(shè)置桌面快捷啟動(dòng)方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
Linux使用sosreport實(shí)現(xiàn)生成系統(tǒng)報(bào)告
sosreport?命令是許多?Linux?發(fā)行版上可用的工具,特別是基于?Red?hat?的系統(tǒng),下面我們來看看如何使用sosreport實(shí)現(xiàn)生成系統(tǒng)報(bào)告吧2025-02-02
centos 7 修改sshd | 禁止 root登錄及sshd端口腳本定義
這篇文章主要介紹了centos 7 修改sshd | 禁止 root登錄及sshd端口腳本定義,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09

