寫在前面 今天,跑在阿裡雲ECS上的生產環境,突然間訪問異常,介面各種報錯,無奈公司沒有專業的運維人員,只能硬著頭皮解決一下。 問題排查 先從錶面看起,資料庫首先報錯 直觀上看,設備沒有可用空間,也就是磁碟滿了。 進入伺服器後臺,執行 發現確實磁碟滿了,而且滿的很徹底。系統盤占用100%,估計什麼服 ...
寫在前面
今天,跑在阿裡雲ECS上的生產環境,突然間訪問異常,介面各種報錯,無奈公司沒有專業的運維人員,只能硬著頭皮解決一下。
問題排查
先從錶面看起,資料庫首先報錯
Caused by: org.postgresql.util.PSQLException: ERROR: could not extend file "base/16385/16587_fsm": No space left on device
建議:Check free disk space.
直觀上看,設備沒有可用空間,也就是磁碟滿了。
進入伺服器後臺,執行
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 7.9G 0 7.9G 0% /dev
tmpfs 1.6G 3.5M 1.6G 1% /run
/dev/vda1 59G 56G 0 100% /
tmpfs 7.9G 4.0K 7.9G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
/dev/mapper/vg0-vol0 1000G 14G 937G 2% /data
tmpfs 1.6G 0 1.6G 0% /run/user/0
發現確實磁碟滿了,而且滿的很徹底。系統盤占用100%,估計什麼服務都跑不動了。/dev/vda1 59G 56G 0 100% /
不過發現/dev/mapper/vg0-vol0 1000G 14G 937G 2% /data
,1000G只用了2%
阿裡雲ECS分為系統盤和數據盤,1000G的是數據盤
第一反應,應該是搭建的PG資料庫的數據沒有移到數據盤上。
將Postgres資料庫數據目錄移動到系統盤
$ sudo -u postgres psql
postgres# SHOW data_directory; # 查看當前數據目錄
data_directory
------------------------------
/var/lib/postgresql/9.5/main
(1 row)
postgres# \q; # 退出
# 為了確保數據的完整性,我們將在實際更改數據目錄之前關閉PostgreSQL
$ sudo systemctl stop postgresql
# 確保關閉完成
$ sudo systemctl status postgresql
. . .
Jul 22 16:22:44 ubuntu-512mb-nyc1-01 systemd[1]: Stopped PostgreSQL RDBMS.
$ sudo rsync -av /var/lib/postgresql /data # /data為要遷移到的新目錄
$ cd /data
$ ls
... postgresql
# 刪除原數據目錄
$ sudo rm -rf /var/lib/postgresql
# 將新數據目錄鏈接到原數據目錄
$ sudo ln -s /data/postgresql /var/lib/postgresql
# 重啟Postgres資料庫
$ sudo systemctl start postgresql
$ sudo systemctl status postgresql
完成以上步驟,即將postgre資料庫數據目錄移到了阿裡雲數據盤
以為OK了,執行
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 7.9G 0 7.9G 0% /dev
tmpfs 1.6G 3.5M 1.6G 1% /run
/dev/vda1 59G 56G 51M 100% /
tmpfs 7.9G 4.0K 7.9G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
/dev/mapper/vg0-vol0 1000G 14G 937G 2% /data
tmpfs 1.6G 0 1.6G 0% /run/user/0
紋絲未動。。。
Ubuntu查詢大文件
猜測是存在大文件導致磁碟被占滿
$ cd /
$ find . -type f -size +800M -print0 | xargs -0 du -h
5.6G ./var/log/syslog.1
6.7G ./var/log/syslog
...
$ rm ...
如果發現是log字眼的大文件,我們可以毫不留情的刪掉,要是遇見一些不認識的,不要貿然刪掉,一定要查清楚文件的作用,能刪則刪,千萬不要不小心刪庫跑路。。。
刪除完畢後,再次查看
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 7.9G 0 7.9G 0% /dev
tmpfs 1.6G 3.4M 1.6G 1% /run
/dev/vda1 59G 45G 12G 80% /
tmpfs 7.9G 4.0K 7.9G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
/dev/mapper/vg0-vol0 1000G 14G 936G 2% /data
tmpfs 1.6G 0 1.6G 0% /run/user/0
多出了12G。
查看已刪除空間卻沒有釋放的進程
這時候,服務應該可以恢覆成功。但你馬上會發現,磁碟又被占滿,而這次,日誌文件卻不算大。
查看已經刪除的文件,空間有沒有釋放,沒有的話kill掉pid
使用rm刪除文件的時候,雖然文件已經被刪除,但是由於文件被其他進程占用,空間卻沒有釋放
$ sudo lsof -n |grep deleted
java 17866 root 237r REG 253,1 163541 1709285 /tmp/tomcat.8250394289784312179.8080/work/Tomcat/localhost/ROOT/upload_c6db0c17_6e6a_4141_bfb6_ac1b2d8a3b0b_00000000.tmp (deleted)
...
$ sudo kill -9 17866
再次使用df -h
命令,磁碟使用率一下子減少了好多。
總結
伺服器系統盤被占滿是非常可怕的!屆時,一切服務都將變得不可用,業務系統也會莫名其妙多出奇怪的問題。所以,運維需要經常性的查看伺服器磁碟占用情況,阿裡雲ECS用戶,可以開啟報警,及時發現問題,解決問題!
阿裡雲ECS提供了系統盤和數據盤,記住,例如Pg、Redis、Cassandra等容易占磁碟的服務,一定要將數據目錄放在阿裡雲ECS提供的數據盤上。
/var/log
是系統日誌目錄,可以經常性的關註下,大容量日誌儘早刪除。- 對待進程不停對文件寫日誌的操作,要釋放文件占用的磁碟空間,最好的方法是線上清空這個文件,可以通過如下命令完成:
[root@localhost ~]# echo "" >/var/log/syslog
通過這種方法,磁碟空間不但可以馬上釋放,也可保障進程繼續向文件寫入日誌,這種方法經常用於線上清理Apache、Tomcat、Nginx等Web服務產生的日誌文件。
最後,有一個專業的運維是多麼重要!