Linux系統優化
我們爲什麼要優化?
linux作爲服務器,當socket運行高併發TCP程序時,通常會出現連接建立到一定個數後不能再建立連接的情況
生產環境下,多次測試,發現每次連接建立到1000左右時,再也不能建立tcp連接,爲什麼呢?
這是因爲在Linux平臺上,無論編寫客戶端程序還是服務端程序,在進行高併發TCP連接處理時,
最高的併發數量都要受到系統對用戶單一進程同時可打開文件數量的限制(這是因爲系統爲每個TCP連接都要創建一個socket句柄,
每個socket句柄同時也是一個文件句柄)。爲了調大TCP最大連接數,必須修改用戶進程可打開文件數限制
我的Linux優化就基於Centos的,如果是其他操作系統,可能參數會有變化,大家就自行去了解一下就好了
優化最大連接數
一、使用以下命令查看當前最大連接數:
ulimit -n
然後我們默認應該都是1024,所以我們需要把它調大
二、修改以下配置文件:
編輯/etc/security/limits.conf
vi /etc/security/limits.conf
在配置文件中添加以上內容
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
第1個參數指定修改root用戶的打開文件數限制,可用'*'號表示修改所有用戶的限制;
第2個參數soft或hard指定要修改軟限制還是硬限制;
第3個參數65535則指定了想要修改的新的限制值,即最大打開文件數(請注意軟限制值要小於或等於硬限制)
nofile有上限,不是無窮大,nofile 65535即上限爲65535
文件內容修改後,重啓系統,再執行第一步操作,發現打開的文件數限制已變爲:65535
有的Linux操作系統,如(Ubuntu)不允許配置 * ,ubuntu的root用戶必須寫出來,其它用戶可用*代替
三、保證/etc/pam.d/login文件中session required pam_limits.so被打開
編輯/etc/pam.d/login
vi /etc/pam.d/login
把以下內容添加上
session required pam_limits.so
然後我們重啓虛擬機,再次輸入 ulimit -n
四、查看Linux系統級的最大打開文件數限制,使用如下命令,我們的最大數是不能大於它的
cat /proc/sys/fs/file-max
這是根據你電腦配置來的,每個人都不一樣
這表明這臺Linux系統最多允許同時打開(即包含所有用戶打開文件數總和)這麼多個文件,是Linux系統級硬限制,所有用戶級的打開文件數限制都不應超過這個數值。通常這個系統級硬限制是Linux系統在啓動時根據系統硬件資源狀況計算
出來的最佳的最大同時打開文件數限制,如果沒有特殊需要,不應該修改此限制,除非想爲用戶級打開文件數限制設置超過此限制的值
Linux系統優化-TCP/IP內核參數優化
一、修改/etc/sysctl.conf文件,在文件最後添加如下行:
net.core.rmem_default = 256960
net.core.rmem_max = 513920
net.core.wmem_default = 256960
net.core.wmem_max = 513920
net.core.netdev_max_backlog = 65535
net.core.somaxconn = 65535
net.core.optmem_max = 81920
net.ipv4.tcp_mem = 131072 262144 524288
net.ipv4.tcp_rmem = 8760 256960 4088000
net.ipv4.tcp_wmem = 8760 256960 4088000
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_syn_backlog = 20000
參數具體的意思自己去看博客:參數詳情
二、執行sysctl命令,讓改動配置立即生效
sysctl -p
如果系統沒有錯誤提示,就表明對TCP/IP內核參數修改成功
Tomcat內存優化
Tomcat在各位JavaWeb從業者常常就是默認的開發環境,但是Tomcat的默認配置作爲生產環境,
尤其是內存和線程的配置,默認都很低,容易成爲性能瓶頸.幸好Tomcat還有很多的提升空間.
我們主要將從性能優化與安全設置這兩個方面入手,對Tomcat進行設置。
springboot因爲是內嵌tomcat,所以我們如果想要修改它的Tomcat配置,只需要在它的application.yml中配置即可
在優化Tomat的前提是你java的環境變量是配置好的,這裏就不說了,不會配置的去看我以前的博客
https://blog.csdn.net/qq_43517653/article/details/100739105
我們先需要上傳一個tomcat,然後解壓。
tar -zxvf apache-tomcat-8.5.20.tar.gz
修改tomcat遠程控制
vi conf/tomcat-users.xml
配置我們進入tomcat的用戶
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="password" roles="admin-gui,admin,manager-gui,manager,manager-script,manager-jmx,manager-status"/>
cd webapps/manager/META-INF/
vi context.xml
將下面配置註釋掉
<Context antiResourceLocking="false" privileged="true" >
將這行配置註釋
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
配置好之後,我們就能查看服務狀態
我們還能直接在Manager App中直接發佈項目
tomcat默認情況下JVM只分配128MB
此環境變量JAVA_OPTS要添加在tomca的bin下catalina.sh裏,位置cygwin=false前
JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xmn768m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -Djava.awt.headless=true"
參數說明:
#-server :啓用jdk的server版,一定要作爲第一個參數,在多個CPU時性能佳
#-Xms2048m :設置JVM最大可用內存爲2048MB
#-Xmx2048m :設置JVM初始可用內存爲2048MB,
:Xms與Xmx普遍選擇配置相同的大小,可以根據實際情況由小向大增加,建議設爲物理內存的一半。不可超過物理內存。
#-Xmn768m :年輕代內存大小,Sun官方推薦配置爲整個堆的3/8,即:2048*3/8=768
#-XX:PermSize=128m :設置堆棧永久區起始大小爲128m
#-XX:MaxPermSize=256m :設置堆棧永久區最大大小爲256m
:在JDK1.8中,取消了PermGen,取而代之的是Metaspace,所以PermSize和MaxPermSize參數失效,
:取而代之的是-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m
#-Djava.awt.headless=true :linux下處理圖片時需加上(windows上不會出問題),否則拋異常:Exception in thread "main" Java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable
Tomcat併發優化(即Tomcat線程優化)
修改conf/server.xml添加Executor,然後在Connector元素添加此線程池的引用
先在server.xml查找被註釋的Executor元素,取消註釋後修改成如下內容
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
prestartminSpareThreads="true"
maxThreads="800"
maxQueueSize="100"
minSpareThreads="50"
maxIdleTime="12000"
threadPriority="5"
/>
屬性說明:
name="tomcatThreadPool" # 配置TOMCAT共享線程池,NAME爲名稱
namePrefix="catalina-exec-" # 線程的名字前綴,用於標記線程名稱
prestartminSpareThreads="true" # executor啓動時,是否開啓最小的線程數
maxThreads="800" # 最大併發連接數,不配置時默認200,一般建議設置500~ 800
maxQueueSize="100" # 任務隊列上限
minSpareThreads="50" # 最小的保持活躍的線程數量,默認是25.這個要根據負載情況自行調整了。太小了就影響反應速度,太大了白白佔用資源
maxIdleTime="12000" # 線程空閒時間,超過該時間後,空閒線程會被銷燬,默認值爲6000(1分鐘),單位毫秒
threadPriority="5" # 線程池中線程優先級,默認值爲5,值從1到10
修改Connector元素,添加Connectorexecutor屬性,tomcatThreadPool即上面配置的線程池
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
...
executor="tomcatThreadPool"
/>
Tomcat的IO優化
即修改Tomcat Connector運行模式,Tomcat Connector(Tomcat連接器)有bio、nio、apr三種運行模式
BIO
同步阻塞IO
每個請求都要創建一個線程來處理,線程開銷比較大。缺點:併發量高時,線程數較多,浪費資源。
Tomcat7或以下,在Linux系統中默認使用這種方式
NIO
異步非阻塞IO
利用Java的異步IO處理,可以通過少量的線程處理大量的請求。
Tomcat8在Linux系統中默認使用這種方式。
Tomcat7必須修改Connector的protocol屬性配置來啓動:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000" redirectPort="8443"/>
APR
大殺器APR,即Apache Portable Run-time libraries,從操作系統層面解決io阻塞問題。apr也是在Tomcat上運行高併發應用的首選模式
Tomcat7或Tomcat8在Win7或以上的系統中啓動默認使用這種方式。
Linux如果安裝了apr和native,Tomcat直接啓動就支持apr。
APR安裝所需軟件(也可以通過apt-get網上直接下載)
apr-1.6.5.tar.gz
apr-iconv-1.2.2.tar.gz
apr-util-1.6.1.tar.gz
openssl-1.0.2q.tar.gz(新版本的ubuntu系統中已安裝openssl)
tomcat-native(tomcat自帶、bin目錄下)
APR安裝步驟
1. 上傳軟件
pscp -r d:/temp/apr [email protected]:/usr/local/java #將包含安裝軟件的文件夾apr傳至/usr/local/java目錄下
2. 解壓安裝文件
cd /usr/local/java/apr
tar -zxvf apr-1.6.5.tar.gz
tar -zxvf apr-iconv-1.2.2.tar.gz
tar -zxvf apr-util-1.6.1.tar.gz
注1:linux命令可以可以分開執行,也可以通過&&符號放到一起執行
tar -zxvf apr-1.6.5.tar.gz && tar -zxvf apr-iconv-1.2.2.tar.gz && tar -zxvf apr-util-1.6.1.tar.gz
3. 安裝apr需要依賴安裝
#ubuntu的依賴安裝
apt-get install -y libtool libapr1 make gcc libexpat1-dev
注1:#centos的依賴安裝
yum install -y apr-devel openssl-devel gcc make expat-devel libtool
4. 安裝apr基礎包
cd /usr/local/java/apr/apr-1.6.5 #進入apr解壓後的目錄
./configure --prefix=/usr/local/apr && make && make install
注1:--prefix參數用於指定apr的安裝路徑,默認值就是“/usr/local/apr”,所以上面的命令也可以寫成如下格式:
./configure && make && make install
5. 安裝apr-iconv包
cd /usr/local/java/apr/apr-iconv-1.2.2
./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr && make && make install
注1:--prefix參數用於指定apr-iconv的安裝路徑
注2:--with-apr告知apr-iconv配置的時候apr的路徑在什麼地方
6. 安裝apr-util包
cd /usr/local/java/apr/apr-util-1.6.1
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv && make && make install
注1:--prefix參數用於指定apr-util的安裝路徑
注2:--with-apr告知apr-util配置的時候apr的路徑在什麼地方
注2:--with-apr-iconv告知apr-util配置的時候apr-iconv的路徑在什麼地方
7. 安裝openssl(此步驟可省略,ubuntu16.04已安裝openssl)
注:Ubuntu可通過如下命令查看OpenSSL相關情況
openssl version -a
8. 安裝tomcat-native
cd /usr/local/apache-tomcat-8.5.20/bin
tar -zxvf tomcat-native.tar.gz # 解壓tomcat-native.tar.gz
cd tomcat-native-1.2.12-src/native/ # 進入解壓後目錄下的目錄native
./configure --with-apr=/usr/local/apr --with-java-home=$JAVA_HOME && make && make install
# 安裝tomcat-native
9. 修改配置server.xml添加apr支持
cd /usr/local/apache-tomcat-8.5.20/conf
vim server.xml
#將配置中的
Connector port="8080" protocol="HTTP/1.1"
改成
Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
將配置中的
Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
改成
Connector port="8009" protocol="org.apache.coyote.ajp.AjpAprProtocol" redirectPort="8443"
注1:8009端口,負責和其他的HTTP服務器建立連接,如果單獨使用tomcat而不與其它的http集成
可以將<Connector port="8009"...>註釋掉而不使用
10. 配置apr相關環境變量
vim /etc/profile
#在文件的最後增加以下內容
export JAVA_HOME=/usr/local/java/jdk1.8.0_151
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH #此3行內容在之前linux課程已配置
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
export LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib
source /etc/profile #設置環境變量立即生效
11. 進行啓動測試
cd /usr/local/apache-tomcat-8.5.20/bin
./startup.sh
tail -100f logs/catalina.out 實時查看日誌文件 後一百行
Tomcat啓動的時候,可以通過log看到Connector使用的是哪一種運行模式:
Starting ProtocolHandler ["http-bio-8080"]
Starting ProtocolHandler ["http-nio-8080"]
Starting ProtocolHandler ["http-apr-8080"]
也可以進入tomcat歡迎頁面,點擊Server Status,再進行查看
設置tomcat自動啓動
在創建tomcat自動啓動腳本時,除了要添加之前的兩個環境變量,還要將LD_LIBRARY_PATH和LD_RUN_PATH添加進來,
注意:多了export關鍵字,並且JAVA_HOME和CATALINA_HOME中是沒有變量引用的
cp /usr/local/apache-tomcat-8.5.20/bin/catalina.sh /etc/init.d
cd /etc/init.d
mv catalina.sh tomcat
chmod a+x tomcat
vim /etc/init.d/tomcat 修改更名後的文件tomcat,添加如下兩個環境變量的配置,請加到#!/bin/sh後面,修改完成後如下
#!/bin/sh
JAVA_HOME=/usr/local/jdk1.8.0_151
CATALINA_HOME=/usr/local/apache-tomcat-8.5.20
export LD_LIBRARY_PATH=/usr/local/apr/lib
export LD_RUN_PATH=/usr/local/apr/lib
end…