MySQL - 防止查詢的作業系統記憶體
在高負載生產伺服器上,我有許多唯一的 SQL 選擇,或者重用將在數小時內完成。我使用
SQL_NO_CACHE
,但這些查詢仍然記憶體在作業系統記憶體中。伺服器有 64G 記憶體,使用的記憶體仍然是 100%,大約 47G 是 OS 記憶體。如果我用 手動刪除作業系統記憶體sync; echo 3 > /proc/sys/vm/drop_caches
,那麼一切都會執行得更順暢。但在幾秒鐘內,作業系統記憶體再次增長到大約 47G 並使用所有空閒記憶體。而且我知道,大部分數據只會被讀取一次,所以記憶體沒有意義。有沒有辦法對 OS 說——“我知道,我不會再讀取這些數據,不要記憶體它們。” ? 如果這可以為單個 mysql 查詢或程序設置,那就太好了。
還有一件事,我知道
innodb_flush_method=O_DIRECT
,但這些表是 MariaDB 上的 Aria 引擎
不,不可能通過作業系統請求不記憶體為特定查詢完成的 IO 的文件讀取。您可以將 sysctl 參數 vm.swappiness 減少到 1 以使記憶體恢復更積極,但這會影響伺服器中的所有 IO 記憶體。
您可以檢查您的query_cache_type是否設置為1嗎?
0 或 OFF - 不將結果記憶體到查詢記憶體中或從查詢記憶體中檢索結果。請注意,這不會取消分配查詢記憶體緩衝區。為此,您應該將 query_cache_size 設置為 0。
1 或 ON - 記憶體所有可記憶體的查詢結果,但以 SELECT SQL_NO_CACHE 開頭的查詢結果除外。
2 或 DEMAND - 僅記憶體以 SELECT SQL_CACHE 開頭的可記憶體查詢的結果。
我對 Aria 不是很熟悉,但我相信它遵循這些設置。我會測試這個選項,看看會發生什麼。
更多資訊:
http://dev.mysql.com/doc/refman/5.6/en/query-cache-configuration.html http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_query_cache_type