記一次生產事故--磁碟被占滿

来源:https://www.cnblogs.com/gcdd/archive/2020/02/10/12292422.html
-Advertisement-
Play Games

寫在前面 今天,跑在阿裡雲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資料庫數據目錄移動到系統盤

參考如何將PostgreSQL數據目錄移動到Ubuntu 16.04上的新位置

$ 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服務產生的日誌文件。

最後,有一個專業的運維是多麼重要!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一、瞭解記憶體空間 本文章文字有點多,會有點枯燥,配合圖文一起看可以緩解枯燥,耐心閱讀哦!!! 先瞭解記憶體地址,才更好的理解指針! 我們可以把記憶體想象為成一列很長很長的貨運火車,有很多大小相同的車廂,而每個車廂正好相當於在記憶體中表示一個位元組。這些車廂裝著不同的貨物,就像我們的記憶體要存著各式各樣的數據 ...
  • WPF允許在代碼中以及在標記中的各個位置定義資源(和特定的控制項、視窗一起定義,或在整個應用程式中定義)。 資源具有許多重要的優點,如下所述: 高效。可以通過資源定義對象,併在標記中的多個地方使用。這會精簡代碼,使其更加高效。 可維護性。可通過資源使用低級的格式化細節(如字型大小),並將它們移到便於對其進 ...
  • 前言 之前的博客我已經在Linux上部署好了.NetCore站點且通過Supervisor對站點進行了進程守護,同時也安裝好了Nginx。Nginx的用處非常大,還是簡單說下,它最大的功能就是方便我們做後續的橫向拓展,當站點的流量越來越大時候可以進行負載均衡,反向代理最大用處也是如此。 反向代理反向 ...
  • 前面兩章介紹了命令的基本內容,可考慮一些更複雜的實現了。接下來介紹如何使用自己的命令,根據目標以不同方式處理相同的命令以及使用命令參數,還將討論如何支持基本的撤銷特性。 一、自定義命令 在5個命令類(ApplicationCommands、NavigationCommands、EditingComm ...
  • WPF中使用第三方控制項來直接進行錄像的控制項沒有找到(aforgenet好像不維護了?WPFMediaKit好像只能實現攝像頭拍照。收費的控制項沒有使用,不做評論。) 通過百度(感謝:https://www.cnblogs.com/giserlong88/p/11244779.html),確定了可以通過 ...
  • 8.軟體 RPM包安裝 8.1rpm安裝 rpm[選項]軟體包名稱 主選項 i 安裝 e卸載 U升級 q查找 輔助選項 ⅴ顯示過程 h hash 查詢 a all查詢所有安裝的包 f file查詢擁有 sr0 [root@MiWiFi R3L srv etc] cd /etc/yum.repos.d ...
  • linux 系統服務入門 ,詳解如何運用systemctl 和xinetd 來進行Linux服務的操作。 ...
  • 鼠年春節,大家都在時刻關心 2019nCoV 疫情發展,沒太多心思搞技術,就在這個時候,ARM 不聲不響搞了個大新聞,如果你登錄 ARM developer 網站,會發現 Cortex-M 家族多了一個新成員:Cortex-M55 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...