SSH原理常見應用升級及端口轉發

SSH介紹

SSH是Secure Shell Protocol的簡寫,由IETF網絡工作小組(Network working Group)指定;在進行數據傳輸之前,SSH先對聯機數據包通過加密技術進行加密處理,加密后在進行數據傳輸。確保了傳遞的數據安全.

SSH是專為遠程登錄會話和其他網絡服務提供的安全性協議。利用SSH協議可以有效的放置遠程管理過程中的信息泄露問題,在當前的生產環境運維工作中,絕大多數企業普遍採用SSH協議服務來代替傳統的不安全的遠程聯機服務軟件,如telnet(23端口,非加密)

在默認狀態下,SSH服務主要提供了兩個服務功能,一個是提供類似Telnet遠程聯機服務器的服務,即上面提到的SSH服務;另一個是類似FTP服務的sftp-server,藉助SSH協議來傳輸數據的,提供更安全的SFTP服務(vsftp,proftp

ssh 客戶端(ssh命令)還包含一個遠程安全拷貝命令scp,也是通過ssh協議工作.

小結

# 1、SSH是安全的加密協議,用於遠程連接linux服務器
# 2、SSH默認端口是22,安全協議版本SSH2,除了2之外還有SSH1(漏洞)
# 3、SSH服務端主要包含兩個服務協議SSH遠程連接,SFTP服務
# 4、Linux SSH客戶端包含ssh遠程連接命令,以及遠程拷貝scp命令

SSH結構

# SSH服務由服務端軟件OpenSSH (openssl)
# 客戶端(常見的有SSH(linux),SecureCRT,Putty,Xshell)組成

# SSH服務默認使用22端口提供服務,它有兩個不兼容的SSH協議版本分別是1.x和2.x

rpm -qa openssh
openssh-6.6.1p1-31.el7.x86_64		# 遠程連接安裝包

rpm -qa openssl
openssl-1.0.2k-19.el7.x86_64		# 加密安裝包

OpenSSH同時支持SSH 1.x2.x 用SSH 2.x的客戶端程序不能鏈接到SSH1.x的服務程序上

SSH服務是一個守護進程(daemon),他在後台運行並響應來自客戶端的連接請求,SSH服務端的進程名為sshd,負責實時監聽遠程SSH客戶端的連接請求,並進行處理,一般包括公共密鑰認證、密鑰交換、對稱密鑰加密和非安全連接等。

SSH客戶端包含ssh以及像scp(遠程拷貝)slogin(遠程登錄)sftp(安全FTP文件傳輸)等應用程序

SSH的工作機制大致是本地的ssh客戶端發送一個連接請求到遠程的ssh服務器,服務器檢查連接的客戶端發送的數據包和ip地址,如果確認合法,就會發送密鑰給SSH的客戶端,此時,客戶端本地再將密鑰發回給服務端,自己建立連接。SSH1.x和SSH2.x在連接協議上有一些安全方面的差異

SSH加密技術

SSH加密技術是將人類可以看得懂的數據,通過一定的特殊的程序算法,把這些數據變成雜亂的無意義的信息,然後,通過網絡進行傳輸,二擋到了目的地后,在通過對應的解密算法,把傳過來的加密的數據信息解密成加密前的可讀取的正常數據。因此,當數據在互聯網上傳輸時即使被有心的黑客監聽竊取了,也很難獲取到真正需要的數據

網絡上的數據包加密技術一般是通過所謂的一對公鑰私鑰(Public key and Pivate key)組合撐的密鑰對進行加密解密操作。

SSH 1.x

每一台SSH服務器主機都可以使用RSA加密方式來產生一個1024-bit的RSA Key 這個RSA的加密方式就是用來產生公鑰和私鑰的算法之一。

當服務動時,就會產生一個768 bit的臨時公鑰存放在Server

grep ServerKey /etc/ssh/sshd_config 
#ServerKeyBits 1024
SSH 2.x

SSH 1.x的聯機過程中,當Server接收Clinet端Private Key后,就不再針對該次聯機的Key pair進行檢驗。若此時有而已黑客對該聯機key pair插入而已的程序代碼時,由於服務端你不會在檢驗聯機的正確性,因此可能會接收該程序代碼,從而導致系統被黑.

為了改正這個缺點,SSH version2多加了一個確認聯機正確性的Diffie-Hellman機制

在每次數據傳輸中,Server都會以該機制檢查數據的來源是否正確,這樣,可以避免聯機過程中被插入而已程序代碼的問題

另外,SSH2同時支持RSADSA密鑰,但是SSH1僅支持RSA密鑰

由於SSH1協議本身存在較大問題,建議使用SSH2的聯機模式

當Client端SSH聯機請求傳送過來時,Server就會將這個768-bit的公鑰傳給Client端

此時Client會將此公鑰與先前存儲的公鑰進行對比,看是否一致,判斷標準是Client端聯機用戶目錄下~/.ssh/known_hosts文件的內容(linux-客戶端

不加用戶默認是root 不加-p 指定端口 默認是22`

ssh -p22222 root@39.108.140.0
The authenticity of host '39.108.140.0 (39.108.140.0)' can't be established.
ECDSA key fingerprint is 17:33:ef:9b:05:b3:69:d3:20:48:49:e1:28:9b:7c:c8.
Are you sure you want to continue connecting (yes/no)? 

# 連接密碼文件存放路徑
cat /root/.ssh/known_hosts 
121.36.43.223 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDgQ7H6KDIPTzOklwMSOxgFI0Xc3rgvwPnCLIuXIuzaCfYQBouM6owCArpj2CXEyk40lSn96ktW1vETbP1JmjEY=

# 第一次SH連接的時候,本地會產生一個密鑰文件~/.ssh/known_hosts
如何防止SSH登錄入侵
# 1、用密鑰登錄,不用密碼登錄
# 2、牤牛陣法:解決SSH安全問題
# 3、防火牆封閉SSH,指定源限制(局域網,信任公網)
# 4、開啟SSH只監聽本地內網IP(ListenAddress 10.0.0.8)
# 5、盡量不給服務器外網IP

SSH客戶端附帶的scp命令

scp的基本語法使用:scp -sercure copyremote file copy program

推push

scp -P22 -rp /root/test.txt root@39.108.140.0:/root/

拉pull

scp -p22 -rp root@39.108.140.0:/root/test.txt ./

# -P 指定端口,默認22,可忽略
# -p 表示拷貝前後保持文件或目錄屬性
# -r 遞歸,表示拷貝目錄
# -l 限制速度

# 小結
# 1、scp是加密的遠程拷貝,而cp僅為本地拷貝
# 2、可以把數據從一台機器推送到另一台機器,也可以從其他服務器把數據拉回到本地執行命令的服務器
# 3、每次都是全量完成拷貝,因此效率不高,適合第一次拷貝用,如果需要增量拷貝,用rsync
ssh服務附帶的sftp功能服務
# 1. rz,sz(lrzsz)
# 2. winscp WinSCP-v4.0.5 基於SSH,sftp
# 3. SFX(xshell) 4) SFTP 基於SSH加密傳輸
# 4. samba,http,ftp,nfs
# FTP工具:vsftp、proftpd、SFTP

# linux sftp客戶端登錄sftp服務方法
# 登錄FTP的方法就是
sftp -oPort=22 root@39.108.140.0:
sftp> put test.txt
Uploading test.txt to /root/test.txt
test.txt                                          100%    0     0.0KB/s   00:00                                   
sftp> ls test.txt 
test.txt

SSH服務認證類型介紹

基於口令安全認證

基於口令的安全驗證的方式就是大家現在一直在用的,只要知道服務器的SSH端口號口令,應服務器的IP及開放的端口,默認都為22,就可以通過ssh客戶端登錄到主機,此時聯機過程中所有傳輸都是加密

基於密鑰的安全驗證

基於密鑰的安全驗證方式是指,需要依靠密鑰,也就是必須事先建立一對密鑰,然後把公用密鑰(Publickey)放在需要訪問的目標服務器上,另外,個還需要把私有密鑰(Private key)放到SSH客戶端或對應的客戶端服務器上

此時,如果要想連接到這個帶有公用密鑰的SSH服務器,客戶端SSH軟件或者客戶端端服務就會想SSH服務端發出請求,請求用聯機用戶密鑰進行安全連接。SSH服務會在收到請求之後,會現在改SSH服務器上連接的用戶的加密路下 放上去的對應用戶密鑰,然後把它和連接的SSH客戶端發來進行密鑰,如果兩個密鑰一直SSH服務就會用公用密鑰加密“質詢”(challenge)並把它發送給SSH客戶端

更改ssh 默認登錄配置

修改SSH服務的運行參數,是通過修改配置文件/etc/ssh/sshd_config實現的

一般來說SSH服務使用默認的配置已經夠很好的工作,如果對安全要求不高,僅僅提供SSH服務的情況不需要修改任何配置

sshd_config配置文件說明:

優化SSH配置文件選項
cp /etc/ssh/sshd_config{,.bak}
vim /etc/ssh/sshd_config
Port 52113              # ssh連接端口默認為22,修改端口號可以提高級別
PermitRootLogin no      # 禁止root遠程登錄
PermitEmptyPasswords no # 禁止空密碼的用戶登錄
UseDNS no               # 不使用DNS進行解析
GSSAPIAuthentication no # 會導致SSH連接慢

# ssh遠程連接服務滿解決方法
sed -ri '13 iPort 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config

SSH優化

優化sshd_config
sed -i '13 iPort 52113\nPermitRootLogin no   \n   禁止root登錄
PermitEmptyPasswords no \n      #        禁止使用密碼
UseDNS no\n                     # 禁用DNS
GSSAPIAuthentication no'        #        禁用GSSAPI
sshd_config
檢查hosts解析
cat >>/etc/hosts <<EOF
39.108.140.0 blog
149.129.38.117 blog2
121.36.43.223 huawei 
49.233.69.195 tenxun 
116.196.83.113 jd 
EOF

useradd oldboy
echo "123456"|passwd --stdin youmen
su – youmen
ssh-keygen -t dsa   //非交互式創建密鑰  

#ssh-keygen是生產密鑰的工具 -t參數是指定密鑰的類型,這裡是建立dsa類型密鑰
#也可以使用ssh-keygen -t rsa來建立rsa類型密鑰

#RSA與DSA加密算法的區別
#RSA:是一種加密算法(PS:RSA也可以進行数字簽名的)它的簡寫的來由是RonRivest、Adi Shamir和LeonAdleman 這三個姓氏加在一起就是RSA

#DSA就是数字簽名算法的英文全稱的簡寫,即Digital Sigenature Algorithm=DSA

# RSA既可以進行加密,也可以進行数字簽名實現認證,而DSA只能用於数字簽名
分發密鑰
yum -y install sshpass
ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa &>/dev/null
sshpass -p youmen ssh -o StrictHostKeyChecking=no  root@192.168.43.159


# 一鍵生成密鑰對
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1

ssh-copy-id -i /root/.ssh/id_dsa.pub root@192.168.43.159
# -i 代表要發送的文件

# ssh-copy-id 只能發公鑰,不能發私鑰

# 1 免密碼登錄是單向的,方向從私鑰(鑰匙)==》公鑰(鎖)
# 2 SSH免密碼登錄基於用戶的,最好不要跨不同的用戶
# 3 ssh連接慢的問題解決
ssh批量管理步驟
# 1、ssh優化和hosts解析
# 2、創建用戶
# 3、生成密鑰對
# 4、分發公鑰到所有服務器 ssh-copy-id
# 5、測試 遠程連接ssh 遠程執行命令ssh ifconfig
# 遠程拷貝文件scp rsync-e隧道模式

ssh常見操作

將本地hosts發送指定IP

1. sudo提權實現沒有權限用戶拷貝

echo“youmenALL= NOPASSWD:/usr/bin/rsync ”>>/etc/sudoers

visudo -c 

scp -P52113 hosts oldboy@192.168.43.159:~	# 最好發送到家目錄下,直接發送到/下是沒有權限

ssh -p22 -t youmen@192.168.43.159 sudo rsync ~/hosts /etc/hosts
# 需要授權sudo權限

2. 使用suid實現沒有權限用戶拷貝

chmod u+s `which rsync`
scp -P22 hosts oldboy@192.168.43.159:~
ssh -p22 youmen@192.168.43.159 rsync ~/hosts  /etc/hosts

3. 使用root進行操作

# rsync使用
rsync -avz hosts -e ‘ssh -p 22’youmen@192.168.43.159:~
# 可以增量備份
查看hosts主機系統版本
 cat view.sh 
#!/bin/sh
for n in blog2 tenxun jd huawei 
do
  echo -n "====$n===="	
  ssh -p 22 $n $1		
done
[root@nginx_test ~]# sh view.sh "cat /etc/redhat-release"
====blog2====CentOS Linux release 7.3.1611 (Core) 
====tenxun====CentOS Linux release 7.6.1810 (Core) 
====jd====CentOS Linux release 7.6.1810 (Core) 
====huawei====CentOS Linux release 7.4.1708 (Core) 
分發文件
cat file.sh 
#!/bin/sh
. /etc/init.d/functions
if [ $# -ne 1 ];then 
    echo "USAGE:/bin/sh $0 FILENAME"	$
    exit 1    
fi
for n in blog2 tenxun jd huawei 
do
  echo -n "====$n===="	
  scp -P22 $1  $n: &>/dev/null
  if [ $? -eq 0 ];then
      action "dis $1 to $n" /bin/true
else
      action "$n" /bin/false
fi
done

sh file.sh /etc/hosts
====blog2====dis /etc/hosts to blog2                       [  OK  ]
====tenxun====dis /etc/hosts to tenxun                     [  OK  ]
====jd====dis /etc/hosts to jd                             [  OK  ]
====huawei====dis /etc/hosts to huawei                     [  OK  ]

SSH端口轉發簡介

SSH會自動加密和解密所有SSH客戶端與服務端之間的網絡數據。但是,SSH還能夠將其他TCP端口的網絡數據通SSH鏈接來轉發,並且自動提供了相應的加密及解密服務。這一過程也被叫做”隧道“(tunneling),這是因為SSH為其他TCP鏈接提供了一個安全的通道來進行傳輸而得名。例如,Telnet ,SMTP ,LDAP這些TCP應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,如果工作環境許中的防火牆限制了一些網絡端口的使用,但是允許SSH的連接,也能夠將通過將TCP用端口轉發來使用SSH進行通訊。

SSH端口轉發兩大功能
# 1. 加密SSH Client端至SSH Server端之間的通訊數據。
# 2. 突破防火牆的簡直完成一些之前無法建立的TCP連接。

本地轉發

命令 -L localport:remotehost:remotehostport sshserver

說明

localport      #  本機開啟的端口號
remotehost      # 最終連接機器的IP地址
remotehostport     #  轉發機器的端口號
sshserver      #  轉發機器的IP地址

# -L 本機端口
# -f 後台啟用,可以在本機直接執行命令,無需另開新終端
# -N 不打開遠程shell,處於等待狀態,不跳到遠程主機,還在主機上,只是搭好了隧道,橋搭好,不ssh上去
# -g 啟用網關功能
# -R 服務端口

# 舉例:
ssh –L 9527:telnetsrv:23 -N sshsrv
telnet 127.0.0.1 9527
# 當訪問本機的9527的端口時,被加密後轉發到sshsrv的ssh服務,再解密被轉發到telnetsrv:23
data < >localhost:9527 < > localhost:XXXXX < > sshsrv:22 < > sshrv:yyyyy < > telnetsrv:23
環境背景

背景:企業內部C服務器只允許telnet連接(23端口)訪問,不允許外部直接訪問,B服務器是一個ssh服務器;有一個用戶需要從外部連接到企業內部的C服務器。

前提:防火牆允許22端口進來(或者企業內部有一個堡壘機,ssh -t通過堡壘機進去)。

原理: 數據一旦telnet以後,數據會發送到本機9527端口,再在本機開一個隨機端口,充當ssh客戶端,再把數據流量發送到22端口的ssh服務端,收到數據以後,解密數據,臨時開一個隨機端口充當客戶端,再把流量發送到23端口telnet服務端

機器: blogA用戶,huawei模擬B機器,tenxun模擬C機器

節點名 IP 軟件版本 硬件 網絡 說明
CentOS7-A 39.108.140.0 1C2G 公有雲 阿里雲
CentOS6-B 121.36.43.223 1C2G 公有雲 華為雲
CentOS6-C 49.233.69.195 1C2G 公有雲 騰訊雲
# ssh協議裏面封裝了telnet,一旦A連接了B主機,立即使用telnet連接C主機,此過程可以突破防火牆的限制
# 實驗
#   A->C    訪問被限制
#    A-B->C  使用B主機作為跳板突破訪問限制
配置步驟

C機器通過iptables拒絕A機器登錄

[root@C ~]# iptables -A INPUT -s 39.108.140.0 -j REJECT
[root@C ~]# yum -y install telnet-server xinetd
[root@C ~]# systemctl start telnet.socket
[root@C ~]# systemctl start xinetd
[root@C ~]# ss -tnl |grep 23
LISTEN     0      128       [::]:23                    [::]:*   

# 此時我們A機器是直接連接不上C機器的
[root@A ~]# ssh 49.233.69.195
ssh: connect to host 49.233.69.195 port 22: Connection refused

# 開啟端口轉發(telnet隧道)
[root@A ~]# ssh -L 10000:49.233.69.195:23 -Nf 121.36.43.223
# 通過本地9527端口訪問centos6-1服務器IP地址使用telnet協議23端口,跳板機ip地址

# 隧道已經搭建好了,此時A主機可以通過telnet訪問C主機
telnet 127.0.0.1 10000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

Kernel 3.10.0-1062.9.1.el7.x86_64 on an x86_64
c login: youmen
Password: 
Last login: Fri Jun 12 22:32:04 from centos-b
[root@C ~]$

# 如何需要刪除這個連接使用killall ssh即可
killall ssh   # 刪除搭建的橋
telnet 127.0.0.1 10000
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused

遠程轉發

遠程轉發機制

# -R sshserverport:remotehost:remotehostportsshserver

# 舉例
ssh–R 9527:telnetsrv:23 –N sshsrv
# 讓sshsrv偵聽9527端口的訪問,如有訪問,就加密后通過ssh服務轉發請求到本機ssh客戶端,再由本機解密後轉發到telnetsrv:23
Data < > sshsrv:9527 < > sshsrv:22 < > localhost:XXXXX < > localhost:YYYYY< >telnetsrv:23

# 需求:
# 在A(Centos7)上開啟smtp服務(postfix),B(Centos6)做跳板,C(Centos6-1)客戶端給Centos7發送郵件

# 流程解釋
C-x->A    (拒絕訪問)
C-B->A      (通過遠程代理,接受訪問)  

環境依然是上面三台機器,只是C服務器換成116.196.83.113 (JD)這台服務器

配置步驟
[root@A ~]# vim /etc/postfix/main.cf 
# inet_interfaces = localhost  # 註釋此行,不讓接口直接綁定在127.0.0.1上
[root@A ~]# systemctl restart postfix
[root@A ~]# ss -tnl |grep 25
LISTEN     0      100          *:25                       *:*                  
LISTEN     0      100         :::25                      :::*  

[root@A ~]# yum -y install telnet-server
[root@A ~]# systemctl start telnet.socket

# 如果B上面有一些影響的防火牆規則就將它刪掉
[root@B ~]# iptables -nL --line-number
[root@B ~]# iptables -D INPUT 1

# 測試下C能不能telnet 25端口連接A
[root@C ~]# 39.108.140.0 25
Trying 39.108.140.0...
Connected to 39.108.140.0.
Escape character is '^]'.
220 nginx_test.localdomain ESMTP Postfix

# 設置防火牆策略,使A不接受C的一切請求
[root@A ~]# iptables -A INPUT -s 39.108.140.0 -j REJECT
[root@C ~]# telnet 39.108.140.0 25
Trying 39.108.140.0...
telnet: connect to address 39.108.140.0: Connection refused

# 使用B遠程轉發,發送郵件到
[root@B ~]# ssh-copy-id root@116.196.83.113:
# 使用B遠程轉發,發送郵件到A,最好免密,否則需要手動口令驗證
[root@B ~]#  ssh -R 50000:39.108.140.0:25 -fN 121.36.43.223

# 此時可以到C跳板機看到已經有端口在監聽了
[root@C ~]# ss -tnl |grep 50000
LISTEN     0      128    127.0.0.1:50000                    *:*                

[root@C ~]# telnet 127.0.0.1 5000
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
[root@zabbix ~]# telnet 127.0.0.1 50000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 nginx_test.localdomain ESMTP Postfix
mail from:youmen@163.com      
250 2.1.0 Ok

openssh升級

下載地址

http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/

具體升級步驟
# 記錄sshd.pid路徑
find / -name sshd.pid

# 查看openssh現有版本
ssh -V

# 使用rpm刪除現有的openssh
rpm -e --nodeps $(rpm -qa | grep openssh)

# 刪除舊的配置文件
rm -rf /etc/ssh/*

# 安裝openssl-devel
yum -y install openssl-devel

# 下載tar.gz包,配置編譯,安裝
wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.0p1.tar.gz

# 編譯並安裝
tar xvf openssh-8.0p1.tar.gz 
cd openssh-8.0p1
./configure --prefix=/usr/ --sysconfdir=/etc/ssh/ --with-ssl-dir=/etc/ssl --with-md5-passwords --mandir=/usr/share/man/
make && make install

# 設置ssh服務開機自啟動
# 複製啟動文件至/etc/init.d/
cp -a contrib/redhat/sshd.init /etc/init.d/sshd
     
# 編輯/etc/init.d/sshd文件, 將PID_FILE改為之前記下的sshd.pid路徑
    sed -i "s/PID_FILE=\/var\/run\/sshd.pid/PID_FILE=\/run\/sshd.pid/" /etc/init.d/sshd
     
# 設置開機啟動sshd
    chkconfig sshd on
    chkconfig --list sshd
    
    
# 編輯/etc/ssh/sshd_config, 設置一些常用參數
sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/" /etc/ssh/sshd_config
sed -i "s/#PubkeyAuthentication yes/PubkeyAuthentication yes/" /etc/ssh/sshd_config
sed -i "s/#PasswordAuthentication yes/PasswordAuthentication yes/" /etc/ssh/sshd_config
sed -i "s/#AllowTcpForwarding yes/AllowTcpForwarding yes/" /etc/ssh/sshd_config
sed -i "s/#X11Forwarding no/X11Forwarding yes/" /etc/ssh/sshd_config
sed -i "s/#PidFile \/var\/run\/sshd.pid/PidFile \/run\/sshd.pid/" /etc/ssh/sshd_config

# 加入系統服務
cat > /usr/lib/systemd/system/sshd.service  << EOF
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
#After=network.target sshd-keygen.service
#Wants=sshd-keygen.service
After=network.target
[Service]
ExecStart=/usr/sbin/sshd
[Install]
WantedBy=multi-user.target
EOF

# 啟用sshd服務
systemctl enable sshd
# 重啟服務
systemctl restart sshd
# 查看服務狀態
systemctl status sshd

# 驗證
ssh -V
OpenSSH_8.0p1, OpenSSL 1.0.2k-fips  26 Jan 2017

SSH設置登錄歡迎信息

到/etc/motd裏面編寫內容,看個人愛好

[root@nginx_test ~]# cat /etc/motd 
  /\/\
  (_人|人_)
   /‥\
  ミ(_Y_)ミ
   > <
  (/ \)
  _(   )_
 (_>―<_)

# 關閉當前會話再登錄
  /\/\
  (_人|人_)
   /‥\
  ミ(_Y_)ミ
   > <
  (/ \)
  _(   )_
 (_>―<_)
[root@nginx_test ~]#
小熊圖案
┴┬┴┬/ ̄\_/ ̄\   
┬┴┬┴▏  ▏▔▔▔▔\   
┴┬┴/\ /      ﹨   
┬┴∕       /   )   
┴┬▏        ●  ▏   
┬┴▏           ▔█    
┴◢██◣     \___/   
┬█████◣       /     
┴█████████████◣   
◢██████████████▆▄   
█◤◢██◣◥█████████◤\   
◥◢████ ████████◤   \   
┴█████ ██████◤      ﹨   
┬│   │█████◤        ▏   
┴│   │              ▏   
┬ ∕    ∕    /▔▔▔\     ∕   
┴/___/﹨   ∕     ﹨  /\   
┬┴┬┴┬┴\    \      ﹨/   ﹨   
┴┬┴┬┴┬┴ \___\     ﹨/▔\﹨ ▔\   
▲△▲▲╓╥╥╥╥╥╥╥╥\   ∕  /▔﹨/▔﹨   
   **╠╬╬╬╬╬╬╬╬*﹨  /  //

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

【JAVA進階架構師指南】之五:JVM性能調優

前言

  首先給大家說聲對不起,最近屬實太忙了,白天上班,晚上加班,回家還要收拾家裡,基本每天做完所有事兒都是凌晨一兩點了,沒有精力再搞其他的了.
  好了,進入正題,讓我們來聊聊JVM篇最後一個章節—-JVM性能調優.童鞋們隨便打開一個大廠的招聘崗位JD,應該都會有JVM調優相關的描述,其實招聘方不一定要求候選人真的對JVM調優有實際調優經驗,但是至少得有思路,知道應該怎樣進行JVM層面的性能調優,說實話,知道如何進行JVM層面的性能調優的人,在面試中確實是有加分的.
  筆者在公司擔任面試官的時候,經常會看到候選人簡歷描述有JVM性能調優經驗,每當這個時候我都會問候選人一個問題,你是如何進行JVM性能調優的,很多童鞋的回答就是:噢,就是調整一下初始堆大小,新生代大小.這明顯不是筆者想要的答案,因為這根本就不叫JVM性能調優.童鞋們對號入座一下,對JVM調優僅僅是我上述說的那樣的,趕緊改一下簡歷,不要說自己會JVM性能調優.說實話,對JVM進行性能調優是對架構師的要求,甚至我敢說很多架構師都不一定有實際的JVM性能調優經驗.話不多說,讓我們進入正題,我們將從以下幾點來講解如何進行性能調優:

  • JVM性能調優的前提
  • JVM性能調優的預備知識
  • STW現象–Stop-The-World
  • 垃圾回收器的種類
  • 性能調優的目的
  • 如何進行性能調優

JVM性能調優的前提

  所有有經驗的架構師一定會有一個共識,JVM層面的性能調優一定是作為最後的調優手段,在此之前,一定要確保系統其它方面都已經做到了極致,無法再進行調優了,在這個前提下,才會考慮JVM性能調優.這裏的其他方面包括從前端到架構到代碼層面,我舉一些例子
從瀏覽器/APP角度可進行的優化有:

  • 減少HTTP請求次數.
  • 使用客戶端緩存.
  • 瀏覽器啟用壓縮
  • 使用CDN加速
  • 動態資源和靜態資源分離

從系統層面可進行的優化有:

  • 啟用緩存,比如redis緩存數據
  • 使用集群
  • 異步處理,比如引入消息隊列
  • 對代碼的優化

  以上列出的每一點,都能單獨拎出來講很久,但是博文篇幅問題,就不細說了,有興趣的童鞋可以自行下去了解,我們只着重說一下代碼優化,相信大家都知道,業界比較公認的編碼規範是阿里巴巴發布的<java開發手冊>,裏面的內容都是阿里集團多年來血的教訓積累的精華,阿里集團內部有一個組織專門負責手冊的編寫和推廣,並且在不斷進行優化,最新版發布到泰山版了(我看的時候還是華山版,哈哈).如果有童鞋還不知道的,我建議去下載下來看一看.另外阿里雲上有<java開發手冊>的考試,如果通過了這個考試,說明你的編碼規範還是不錯的,有興趣的童鞋可以去試一下.
  除此之外,童鞋們還應該了解JVM本身為我們悄悄做的各種優化,其中最重要的是JIT編譯器的優化.我舉幾個例子,比如:方法內聯,逃逸分析等.默認情況下,這些都是開啟的,如果不開啟這些功能,JVM性能會下降50%以上.除此之外,還有一些比如:棧上分配,TLAB等優化.這些內容由於平時我們開發中不會用到,是JVM在背後悄悄為我們做了優化,因此可能很多童鞋都不知道,但是如果想成為一個合格的架構師,這些內容都是必須要知道的,畢竟架構師的知識廣度和深度決定了架構師的高度.
  除此之外,性能調優一定是基於性能測試的,空口說進行性能調優的都是耍流氓,只有在經過了實際的性能測試后,我們才知道系統的瓶頸在哪裡,才知道那些方面需要進行調優,如何進行調優.常用的性能測試指標有TPS/QPS/吞吐量.並且默認所有的接口訪問都遵循二八原則(接口每天80%的訪問量集中在20%的時間內).

JVM性能調優的預備知識

  在進行JVM性能調優之前,我們還得了解JVM,比如我前面的幾篇有關JVM的博文,都是需要掌握的,比如JVM內存模型,垃圾回收機制等等.另外我們還需要掌握一些進行JVM分析的工具.其實在我們安裝JDK的時候,JDK已經為我們準備了許多有用的性能調優監控工具,我們可以看一下JDK安裝目錄下的bin目錄:

  • jps: 主要用來輸出JVM中運行的進程狀態信息
  • jstack: 主要用來查看某個Java進程內的線程堆棧信息
  • jmap: 用來查看堆內存使用狀況,一般結合jhat使用
  • jstat: JVM統計監測工具
  • jconsole: 圖形化的統計工具
  • jvisualvm: 比jconsole功能更強的圖形化的監控工具

  另外我們需要知道,當JVM發生OOM異常時,可以使用命令生成一個.hprof後綴的dump文件,該文件是某個時間節點的heap的快照,我們可以使用VisualVM來查看,也可以用第三方提供的一些工具,比如eclipse的MAT來查看內存溢出的原因.

STW現象

  所謂STW現象(Stop-The-World)是指在執行垃圾收集算法時,Java應用程序的其他所有線程(除了垃圾收集線程之外的線程)都被掛起.此時,系統只允許GC線程繼續運行,其他線程全部暫停,等待GC線程執行完畢后才能繼續執行.這些工作都是由虛擬機在後台自動發起和自動完成的,是在用戶不可見的情況下把用戶正常工作的線程全部停掉,舉個例子,某個接口平時可能只需要50ms的RT,忽然某次調用花費了200ms.因此STW對實時性要求很高的系統來說是難以接受的.

垃圾回收器的種類

  既然有STW現象,那麼有沒有解決方案呢?這就是我們接下來要講的,垃圾回收器的種類,目前為止,JVM一共為我們提供了七種垃圾回收器,其中年輕代有三種,老年代有三種,另外還有一種特殊的G1:

  當然,在更新版本的JDK中還有一種ZGC,為未來垃圾回收器提供了一種趨勢,有興趣的童鞋可以自行了解.

性能調優的目的和具體過程

  有了前面的鋪墊,終於來到了我們最重要的正題:如何進行JVM性能調優?在我看來JVM調優的具體步驟分為如下幾步:

  • 確定調優的目的,選擇合適的GC collector
  • 調整JVM heap的大小
  • 調整young generation在整個JVM heap中所佔的比重.

確定調優的目的,選擇合適的GC collector

  由於每種垃圾回收器的特性並不相同,因此我們需要根據我們的調優目的選擇合適的垃圾回收器,比如,我們需要降低STW的停頓時間,那我們就不能選用串行和并行的垃圾回收器,而應該選用併發的垃圾回收器,即CMS,與之搭配的新生代垃圾回收器就應該選用ParNew.目前一般主流互聯網公司都是用CMS垃圾回收器.

調整JVM heap的大小

  確定了垃圾回收器的類型,就需要調整JVM heap的大小,在這一步的時候,首先我們需要了解JVM相關的一些指令,比如可以在啟動java程序時加上
-XX:+HeapDumpOnOutOfMemoryError,當發生OOM時,JVM會自動為我們生成DUMP文件
-XX:+PrintGCDetails -Xloggc:D:\gclogger\gc.log -XX:+PrintGCDateStamps 生成GC日誌
-Xms2g -Xmx2g 當然,還應該要根據實際情況設置heap的最大最小值,童鞋們要知道,默認情況下,java程序啟動的最小heap大小為1/64物理內存,最大值為1/4物理內存,一般要求我們最大最小值保持一致,避免JVM頻繁擴容和縮容導致不必要的性能浪費.

調整young generation在整個JVM heap中所佔的比重.

  確定了heap的大小,還需要確定新生代的比重
–Xmn1500m -XX:MetaspaceSize=150M

  當然,再厲害的架構師也不可能一次就調整得出最佳的JVM配置參數,而是應該多設置幾組不同的值,放到生產環境(或者和生產環境一樣的環境,比如阿里內部有預發環境,和生產環境保持一致)進行性能測試,通過對比結果得出最佳的JVM性能調優參數,完成JVM性能調優.

總結

  讀完了本篇文章,我相信童鞋們應該或多或少會有些收穫.掌握JVM調整的核心步驟:

  • 確定調優的目的,選擇合適的GC collector
  • 調整JVM heap的大小
  • 調整young generation在整個JVM heap中所佔的比重.
      不了解如何進行JVM的調優的人,把本文內容好好理解后,能讓面試官刮目相看;了解JVM調優,但是條理不清晰的童鞋,可能會對JVM調優有更清晰的認識.總而言之,筆者認為本文是一篇滿滿的乾貨,網上許多講JVM調優的博文,並沒有這麼系統的講解過真正應該如何進行JVM調優.當然筆者能力有限,如文章有錯誤,歡迎指正,畢竟是人就會犯錯.
      PS:一入JVM深似海,從此再也出不來.對JVM有興趣的童鞋,可以鑽研,但是在經驗不足之前,不建議太過深入了解JVM,否則會耽誤自己.當然,立志要成為一名牛逼的架構師,這些都是必須要會的.
      本文我們講完了JVM,下一篇開始,讓我們繼續學習JAVA鎖相關的內容.
      如果覺得博主寫的不錯,歡迎關注博主微信公眾號,博主會不定期分享技術乾貨!

本文由博客一文多發平台 OpenWrite 發布!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化

※產品缺大量曝光嗎?你需要的是一流包裝設計!

神奇夢幻的藍色光芒 點亮愛爾蘭海灘

摘錄自2020年9月8日大紀元報導

在愛爾蘭南部的一座海灘上出現一種奇特景象,攜帶著發光物質的海洋生物照亮了拍打過來的海浪,呈現一片夢幻的螢光藍色。

其實,芳泉鎮海灘以生物發光這一獨特的自然奇觀而聞名於世。生物發光是諸如細菌、藻類、水母以及浮游生物等海洋生物發光現象的一種說法。這種現象可以發生在任何深度的海水中,但當它發生在淺水區時,就會產生特別超現實的景象。較溫暖的天氣使水溫大面積上升,能充分給予海洋生物所需的能量,從而使其發光更加明亮。

根據愛爾蘭海洋研究與保護組織的說法,在愛爾蘭水域,生物發光是由稱為夜光藻(Noctiluca scintillans)的單細胞鞭毛藻發出的,這種藻類通常被稱為「星光海」(Sea Sparkle)。

海洋
環境新聞
國際新聞
愛爾蘭
海灘

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

武肺後經濟復甦關鍵 非洲11國部長籌資造「綠色長城」

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

「三棵樹為花、兩棵樹為蝴蝶」 日本建商推庭院改革 鼓勵種植原生種

文:宋瑞文

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

美西野火更加猖狂 一周燒掉兩年份的土地

摘錄自2020年9月13日聯合報報導

從美國加州、俄勒岡州到華盛頓州的太平洋沿岸,近日山林大火不斷延燒,規模空前。科學家警告,氣候變遷將帶來天然災害,目前狀況只是前奏。BBC報導,雖然是強風等自然因素使美國西岸野火蔓延,不過,是人為活動導致氣候暖化,才使野火火勢變大且破壞性更強。

世界有紀錄以來最熱10年,有9年落在2005年之後。聯合國上周警告,2016年到2020年這5年,很可能成為有紀錄以來最熱的5年。俄勒岡州與加州的均溫從1900年來上升超過攝氏1度。

加州有紀錄以來規模最大的20場野火中,有6場發生在今年。在俄勒岡州,野火上周焚燒的面積,接近野火平均每年燒毀面積的2倍。

賓州州立大學地球系統科學中心主任曼恩說,今後的天災會有多嚴重,取決於人類如何降低溫室氣體排放,危險的氣候變遷顯然已經到來,「關鍵在於我們要讓問題惡化到多嚴重」。

氣候變遷
國際新聞
美國
森林野火

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

美野火霧霾飄上去 溫哥華空氣慘淪全球最糟

摘錄自2020年9月13日中國時報報導

森林野火仍持續肆虐美國西岸,造成多人死傷與災害,不過北邊的加拿大溫哥華也成為苦主,野火燒出的灰燼、霧霾不斷飄過去,根據排名,溫哥華昨(12)日淪為全球空氣最糟的城市之一,空氣品質甚至比舊金山、洛杉磯等遭野火直接蹂躪的城市還要糟。

不過據《溫哥華太陽報》(Vancouver Sun)報導,距離華盛頓州不遠的溫哥華也成為美國西岸野火狂燒的苦主,即便天氣預報先前預告,溫哥華地區12日將迎來晴天,不過當天天空卻是灰濛濛一片,美國野火燃燒的灰燼與霧霾飄向北方,導致大溫哥華地區空氣品質嚴重下滑。

根據瑞士空氣清淨科技公司IQAir排名,周六溫哥華淪為全球空氣污染最嚴重的主要城市,空氣品質比波特蘭、舊金山、洛杉磯等美國西岸城市還要糟糕,甚至還比北京、德里等傳統上被視為空污最嚴重的城市糟糕。

氣候變遷
國際新聞
加拿大
森林野火
空污

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※產品缺大量曝光嗎?你需要的是一流包裝設計!

南極「末日冰川」快速融化 冰層基底找到元兇了

摘錄自2020年9月13日自由時報報導

冰天雪地的南極冰層近年來快速融化,英國、美國科學家最新發現,被稱為「末日冰川」的南極思韋茨冰川(Thwaites Glacier)之所以會快速融化,是因為冰層基底有攝氏2度的暖流不斷沖刷。

根據《英國廣播公司》(BBC)報導,1份發布在《冰凍圈》(The Cryosphere)學術期刊的最新研究指出,美國太空總署(NASA)與英國南極勘察局(BAS)發現,思韋茨冰川前緣是懸空於大陸棚之上,大西洋暖流攝氏2度的海水因此得以沖向冰川基底與大陸棚連接之處,使冰點-2度的冰受熱融化,進而露出更多面積被暖流沖刷,惡性循環下導致冰川快速融化。

研究顯示,思韋茨冰川底部與大陸棚連接之處,因此被沖刷出1個大約600公尺的空隙,且空隙還在擴大,該冰川在南極有數百萬年歷史,若完全消失,將連帶使其他冰層跟著融化、全球海平面將上升2至3公尺,因此被稱為「末日冰川」,按照目前的融化速度,整個冰棚絕對難以逃過崩塌的命運,屆時整個地球海洋與大氣的循環體系都會受到嚴重影響。

氣候變遷
國際新聞
南極
冰川
冰川融化

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

近期最火的7座家用車才8萬不到,6款車型究竟怎麼選?

它也是我們今天的主角——比亞迪宋MAX。而在空間方面,比亞迪宋MAX採用了2+3+2的座位布局,而寶駿730和歐尚A800均採用了2+2+3的座位布局,而在內部空間方面,歐尚A800與寶駿730的實際表現更佳,不過對於一款7座MpV來說,比亞迪宋MAX雖然在空間方面稍顯劣勢,但已經足夠使用,而且二排座椅也同樣支持前後移動,所以足夠我們日常7人的出行所需。

其實在不少消費者心目當中,MpV都是與麵包車劃上等號,而在合資品牌當中,奧德賽和GL8便是其中的最受歡迎車型,但是他們在售價方面,超過20萬的車價也並不是每位消費者都能消費得起!值得一說的是,我們今天的主角也同樣屬於爆款車型,而最讓我們驚喜的是,它的起售價才7.99萬起!

它也是我們今天的主角——比亞迪宋MAX!

而在空間方面,比亞迪宋MAX採用了2+3+2的座位布局,而寶駿730和歐尚A800均採用了2+2+3的座位布局,而在內部空間方面,歐尚A800與寶駿730的實際表現更佳,不過對於一款7座MpV來說,比亞迪宋MAX雖然在空間方面稍顯劣勢,但已經足夠使用,而且二排座椅也同樣支持前後移動,所以足夠我們日常7人的出行所需。

而針對於另外兩款競品車型,其實不難發現在設計方面兩款競品車型依然充滿着濃濃的麵包車氣息,而對於比亞迪宋MAX來說,無疑更適合居家使用,而它能擁有如此高的顏值還是得益於剛從奧迪挖角過來的設計總監艾格的功勞。而還是希望比亞迪能給我們帶來更多高顏值的產品!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

月銷25000!10萬起要買高B格的國產SUV就看它了~

推薦理由:榮威RX5以車聯網為賣點,推薦配置比較豐富的兩驅自動互聯網智惠版,帶有升級的汽車智能係統2。舒適配置應有盡有,全景天窗、無鑰匙進入/無鑰匙啟動,還有前排座椅加熱,照顧到北方消費者的需求。在自主SUV當中,榮威RX5是一款實力非常強的車型,無論是外觀還是內飾的設計都是比較優秀的,甚至比一些合資SUV還要好,18款對配置進行了改進升級,相信會適合更多消費者。

國產SUV界的網紅SUV,“15萬王”榮威RX5,9月份售出了2萬5台,成績相當不錯。而在近日,其2018款已經上市,2018款車型外觀和造型和現款一樣沒有改動,主要是針對車型和配置進行了升級,新款車型總共12款車型,新增了3款車型,另外兩款車型配置也有提升,這款車究竟如何呢?請看介紹。

推薦理由:榮威RX5以車聯網為賣點,推薦配置比較豐富的兩驅自動互聯網智惠版,帶有升級的汽車智能係統2.0;舒適配置應有盡有,全景天窗、無鑰匙進入/無鑰匙啟動,還有前排座椅加熱,照顧到北方消費者的需求。

在自主SUV當中,榮威RX5是一款實力非常強的車型,無論是外觀還是內飾的設計都是比較優秀的,甚至比一些合資SUV還要好,18款對配置進行了改進升級,相信會適合更多消費者。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案