一般C/C++寫程序由於內存、指針等問題在後期的過程都一般會遇到內存等資源洩露、崩潰等問題,對於這些問題,一般從哪個角度解決呢?
下面從幾個角度進行總結:
首先需要注意一個問題是top或者htop顯示的內存使用中cache的問題,這個和windows中的任務管理器看到的有差別。
具體分析如下:
在linux讀寫文件時,它用於緩存物理磁盤上的磁盤塊,從而加快對磁盤上數據的訪問。
buffer cache的內容對應磁盤上一個塊(block),塊通常為1K,都是連續的。在linux下,為了更有效的使用物理內存,操作系統自動使用所有空閒內存作為Buffer Cache使用。當程序需要更多內存時,操作系統會自動減小Cache的大小。我們在觀察Linux的內存使用情況時,只要沒發現用swap的交換空間,就不必擔心自己的內存太少。http://blog.csdn.net/heizistudio/article/details/25125061
如下圖,htop顯示的數據,其中長時運行時,Mem項有時會使用完了,此時並不表明程序洩露占用,檢查真正的進程項目的RES項的內存使用,這個是正在使用的,或者執行 pmap -d 某個進程號,也可以查看
[htop還可以直觀的查看線程情況]
有了這些問題,那我們有更好的辦法避免嗎?答案是:
Ø 智能指針
n C++ 11標准已經有了,stl中的auto_ptr盡量還是避免吧
n boost的share_ptr是常用的
n 雙刃劍,使用這個在特定的場景下資源消耗比純生的new delete效率又損失
Ø df -k /##
n 如果某個目錄下的操作文件反復讀寫,可以看到正在使用和已經使用的信息,據此可以查看是否有文件沒有關閉
Ø Lsof
n 列出當前系統打開文件的工具
n lsof -p pid
n http://blog.csdn.net/guoguo1980/article/details/2324454
Ø fuser
n 用來顯示所有正在使用著指定的file, file system 或者 sockets的進程信息
n http://www.cnblogs.com/yuboyue/archive/2011/07/18/2109838.html
查看網絡信息的netstat ss
http://stackoverflow.com/questions/11763376/difference-between-netstat-and-ss-in-linux
http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201222502510543/
windows下有sysinternals工具,非常方便監控widnows的文件、網絡、注冊表等的訪問;Linux的更厲害的武器,不過都是文件,查看起來有點麻煩,用習慣了功能更強大。
http://blog.csdn.net/jeek566/article/details/8695240
mysql命令行可以初步查看,如下:
root@csbit:~# mysql -uroot -proot
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 5.6.21 MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show processlist;
+----+-------+-----------+--------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------+-----------+--------+---------+------+-------+------------------+
| 28 | root | localhost | NULL | Query | 0 | init | show processlist |
+----+-------+-----------+--------+---------+------+-------+------------------+
3 rows in set (0.00 sec)
如果show processlist顯示的數據不斷增多,軟件就是有鏈接洩露,c++處理最好使用cppdb這些有連接池處理的第三方庫加速
如果想檢查更詳細的信息MONyog這個工具可以一用
洩露分析工具
http://www.cnblogs.com/2018/p/3228174.html
http://www.cnblogs.com/2018/p/3230736.html
http://www.cnblogs.com/2018/p/3010691.html
http://www.cnblogs.com/2018/archive/2012/05/18/2503897.html
問題出來後,如何改善系統性能,此時切記8/2原則,首先修改的是關鍵路徑的部分
http://www.cnblogs.com/2018/p/3380773.html