LINUX 運維工作手冊

釋放內存:


sync
echo 3 > /proc/sys/vm/drop_caches
 
Linux查看Dell服務器型號
命令
dmidecode | grep "Product Name"


查看系統負載:
cat /proc/loadavg
0.0  0.00 0.00 1/283 10904
意思是:前三個是系統負載,1/283中,1代表此時運行隊伍中的進程個數,而283是代表此時的進程總數
10904
到此爲止,最後創建的一個進程ID
 
系統裝好後,要做的事如下:
關閉防火牆Selinux:
vim /etc/selinux/config
SELINUX=enforcing改成SELINUX=disabled
更改主機名:
vim /etc/sysconfig/network
修改主機名,不要用localhost
添加hosts主機記錄
vim /etc/hosts
中,在127.0.0.1後面,添加自己的主機名
 
創建0-9 a-z目錄
for i in `seq 0 9` {a..z};do mkdir -p $i;done
 
測試硬盤性能工具:iozone
監視服務器每少上下文切換數次工具
Nmon(很不錯的性能監視工具)
 
#佔用內存大小前10的進程
ps -eo comm,size --sort -size | head -10 
#佔用
cpu使用前10的進程
ps -eo comm,pcpu --sort -pcpu | head -10 


 
 
一、Apache服務優化: 2
1.配置cronolog進行日誌輪詢 2
2.錯誤頁面優雅顯示 2
3.mod_deflate文件壓縮功能 3
4.mod_expires緩存功能 4
5.更改apache的默認用戶 5
6.worker模式,提升併發數(可以達到2000-5000) 5
7.屏蔽apache版本等敏感信息 6
8.apache目錄文件權限設置(root,目錄755,文件644) 6
9.開啓httpd-mpm.conf 增加連接數 6
10. apache防盜鏈功能 8
11.禁止目錄Index 8
12. 禁止用戶覆蓋(重載) 8
13.關閉CGI 9
14.避免使用.htaccess文件(分佈式配置文件) 9
15. apache的安全模塊 9
16.正確途徑取得源代碼,勤打apache補丁 10
17.apache日誌授予root 700權限 10
18.系統內核參數優化 10
19.禁止PHP解析指定站點的目錄 10
20.使用tmpfs文件系統替代頻繁訪問的目錄 11
21儘可能減少 HTTP 請求數 11
22使用CDN做網站加速 12


 
 
查看你的服務器網絡連接狀態
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
◆CLOSED:無連接是活動的或正在進行 
◆LISTEN:服務器在等待進入呼叫 
◆SYN_RECV:一個連接請求已經到達,等待確認 
◆SYN_SENT:應用已經開始,打開一個連接 
◆ESTABLISHED:正常數據傳輸狀態 
◆FIN_WAIT1:應用說它已經完成 
◆FIN_WAIT2:另一邊已同意釋放 
◆ITMED_WAIT:等待所有分組死掉 
◆CLOSING:兩邊同時嘗試關閉 
◆TIME_WAIT:另一邊已初始化一個釋放 
◆LAST_ACK:等待所有分組死掉 
ESTABLISHED的值其實也是當前的併發數,這個可重點關注下;另外,可關注下TIME——WAIT這項的數值。Linux下高併發的Squid服務器,TCP TIME_WAIT套接字數量經常達到兩、三萬,服務器很容易被拖死。通過修改Linux內核參數,可以減少Squid服務器的TIME_WAIT套接字數量。
 
#查看系統本地可用端口極限值
cat /proc/sys/net/ipv4/ip_local_port_range



 
尋找惡意IP並用iptables禁止掉
netstat -an| grep :80 | grep -v 127.0.0.1 |awk '{ print $5 }' | sort|awk -F: '{print $1,$4}' | uniq -c | awk '$1 >50 {print $1,$2}'
 
 
4.5備份單個
數據庫
mysqldump -u 用戶 –p’密碼’ --default-character-set=latin1 數據庫名 > 備份文件名(數據庫默認編碼是latin1)
普通備份:
mysqldump -uroot -p'oldboy123' oldboy > /server/bak/oldboy.sql
壓縮備份:
mysqldump -uroot -p'oldboy123' oldboy |gzip > /server/bak/oldboy.sql.gz
設置字符集備份:
mysqldump -uroot -p'oldboy123' oldboy --default-character-set=gbk |gzip > /server/bak/oldboy.sql.gz
執行結果:
[root@oldboy ~]# mkdir /server/bak -p
[root@oldboy ~]# mysqldump -uroot -p'oldboy123' oldboy > /server/ba
backup/ bak/   
[root@oldboy ~]# mysqldump -uroot -p'oldboy123' oldboy > /server/bak/oldboy.sql
[root@oldboy ~]# mysqldump -uroot -p'oldboy123' oldboy |gzip > /server/bak/oldboy.sql.gz
[root@oldboy ~]# ls -l /server/bak/
total 8
-rw-r--r-- 1 root root 1991 Apr  9 00:51 oldboy.sql
-rw-r--r-- 1 root root  801 Apr  9 00:51 oldboy.sql.gz
4.6 mysqldump在做啥?
mysqldump實際上就是把數據從mysql庫裏以邏輯的sql語句的形式導出。
備份的數據過濾掉註釋:
[root@oldboy ~]# egrep -v "\*|--|^$" /server/bak/oldboy.sql
DROP TABLE IF EXISTS `test`;

CREATE TABLE `test` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=gbk;
LOCK TABLES `test` WRITE;
INSERT INTO `test` VALUES (1,'zhaoyue'),(2,'jesse'),(4,'elain'),(5,'wodi'),(6,'yingsui'),(7,'zhangyang'),(8,'zaixiangpan'),(9,'??????'),(10,'鑰佺敺瀛?),(11,'?); <==這裏是亂碼,是因爲導出時的格式沒加字符集,而系統當前字符集又是zh_cn.gb18030格式,一般恢復到數據庫裏會正常,只是系統外查看不正常而已。另外insert是批量插入的方式,這樣在恢復時效率很高。
UNLOCK TABLES;
提示:看到了吧,就是我們曾經插入的表和數據。
[root@oldboy ~]# mysqldump -uroot -p'oldboy123' oldboy --default-character-set=gbk > /server/bak/oldboy-gbk.sql
[root@oldboy ~]# egrep -v "\*|--|^$" /server/bak/oldboy-gbk.sql
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=gbk;
LOCK TABLES `test` WRITE;
INSERT INTO `test` VALUES (1,'zhaoyue'),(2,'jesse'),(4,'elain'),(5,'wodi'),(6,'yingsui'),(7,'zhangyang'),(8,'zaixiangpan'),(9,'??????'),(10,'
老男孩'),(11,''); <==。其他亂碼是當初插入時就有問題的。
UNLOCK TABLES;
4.7備份多個庫
[root@oldboy ~]# mysqldump -uroot -p'oldboy123' -B oldboy mysql --default-character-set=gbk > /server/bak/oldboy-gbk-muli.sql
提示:-B參數是關鍵,表示接多個庫。

※※※※※(生產環境常用)
  -B, --databases     To dump several databases. Note the 
difference in usage;
                      In this case no tables are given. All name arguments are
                      regarded as databasenames. 'USE db_name;' will be
                      included in the output.
參數說明:該參數用於導出若干個數據庫,在備份結果中會加入USE db_nameCREATE DATABASE `db_name`;
      -B後的參數都將被作爲數據庫名。該參數比較常用。當-B後的數據庫列全時 同 -A參數。請看-A的說明。
4.8備份單個表
mysqldump -u 用戶名 -p 數據庫名 表名備份的文件名
mysqldump -u root -p oldboy test> oldboy_oldboy.sql

執行結果:
[root@oldboy ~]# mysqldump -uroot -p'oldboy123' oldboy test --default-character-set=gbk > /server/bak/oldboy-gbk-single.sql
提示:無-B參數,庫oldboy後面就是test表了。
4.9備份多個表
[root@oldboy ~]# mysqldump -uroot -p'oldboy123' oldboy test ett --default-character-set=gbk > /server/bak/oldboy-gbk-muti-tables.sql
[root@oldboy ~]# egrep -v "\*|--|^$" /server/bak/oldboy-gbk-muti-tables.sql
DROP TABLE IF EXISTS `test`;

CREATE TABLE `test` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=gbk;
LOCK TABLES `test` WRITE;
INSERT INTO `test` VALUES (1,'zhaoyue'),(2,'jesse'),(4,'elain'),(5,'wodi'),(6,'yingsui'),(7,'zhangyang'),(8,'zaixiangpan'),(9,'??????'),(10,'老男孩'),(11,'');
UNLOCK TABLES;
DROP TABLE IF EXISTS `ett`;
CREATE TABLE `ett` (

  `id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
LOCK TABLES `ett` WRITE;
UNLOCK TABLES;
4.10備份數據庫結構(不包含數據)
mysqldump -uroot 
-d -p'oldboy' oldboy oldboy> oldboy_oldboy.sql
-d 只備份表結構
[root@oldboy ~]# mysqldump -uroot -p'oldboy123' -d oldboy >/tmp/desc.sql                         
[root@oldboy ~]# egrep -v "\*|--|^$" /tmp/desc.sql            
DROP TABLE IF EXISTS `ett`;
CREATE TABLE `ett` (
  `id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=gbk;
更多用法可以 執行 mysqldump –help 查詢。有關mysqlmysqldump同學們要詳細總結。
5恢復數據庫
5.1 source命令恢復
進入mysql數據庫控制檯,mysql -u root -p
mysql>use 數據庫
然後使用source命令,後面參數爲
腳本文件(如這裏用到的.sql)
mysql>source oldboy_db.sql #這個文件是系統路徑。
[root@oldboy bak]# mysql -uroot -p'oldboy123'
Welcome to the MySQL monitor.  Commands end with ; or \g.
...skip...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 
mysql> use oldboy
Database changed
mysql> show tables;
+------------------+
| Tables_in_oldboy |
+------------------+
| ett              |
| test             |
+------------------+
2 rows in set (0.00 sec)
 
mysql> drop tables test;
Query OK, 0 rows affected (0.01 sec)
 
mysql> system ls .
oldboy-gbk-muli.sql         oldboy-gbk-single.sql  oldboy.sql
oldboy-gbk-muti-tables.sql  oldboy-gbk.sql         oldboy.sql.gz
mysql> source ./oldboy.sql <==還是用第一版沒加字符集的備份,就是備份後查看亂碼的備份。
Query OK, 0 rows affected (0.00 sec)
...skip...
Query OK, 0 rows affected (0.00 sec)
Q...skip...
Query OK, 0 rows affected (0.00 sec)
 
mysql> select * from test;
+----+-------------+
| id | name        |
+----+-------------+
|  1 | zhaoyue     |
|  2 | jesse       |
|  4 | elain       |

|  5 | wodi        |
|  6 | yingsui     |
|  7 | zhangyang   |
|  8 | zaixiangpan |
|  9 | ??????      |
| 10 | ???         |<==亂碼
| 11 | ?           |
+----+-------------+
10 rows in set (0.00 sec)
 
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)
 
mysql> select * from test;
+----+-------------+
| id | name        |
+----+-------------+
|  1 | zhaoyue     |
|  2 | jesse       |
|  4 | elain       |
|  5 | wodi        |
|  6 | yingsui     |
|  7 | zhangyang   |
|  8 | zaixiangpan |
|  9 | ??????      |
| 10 | 老男孩      | <==仍然是正常的,就是說備份不加字符集導出,將來恢復不會影響恢復的數據,但是備份後查看文件會亂碼。
| 11 |           |
+----+-------------+
10 rows in set (0.00 sec)
5.2 mysql命令恢復(標準)
mysql -u oldboy -p'oldboy' oldboy < oldboy.sql
mysql> system mysql -uroot -p'oldboy123' oldboy < oldboy-gbk.sql <==導入

的是備份時加字符集的版本。
mysql> select * from test;
+----+-------------+
| id | name        |
+----+-------------+
|  1 | zhaoyue     |
|  2 | jesse       |
|  4 | elain       |
|  5 | wodi        |
|  6 | yingsui     |
|  7 | zhangyang   |
|  8 | zaixiangpan |
|  9 | ??????      |
| 10 | 老男孩      |<==因爲上文source導入時已經set names gbk了, 所以此處不是亂碼。
| 11 |           |
+----+-------------+
10 rows in set (0.00 sec)
 
 
 
 
2.1.1.1 MyISAM引擎備份
    由於MyISAM引擎爲表級鎖,因此,在備份時需要防止在備份期間數據寫入而導致不一致,所以,在備份時使用--lock-all-tables加上讀鎖
mysqldump -A -F -B --lock-all-tables |gzip >/data/backup/$(date +%F).tar.gz
特別提示:有關MyISAMInnoDB引擎的差別和在工作中如何選擇,在前面的文章已經詳細講解過了,這裏就不在講了。

2.1.1.2 InnoDB引擎備份
InnoDB引擎爲行鎖,因此,備份時可以不對數據庫加鎖的操作,可以加選項--single-transaction進行備份:

mysqldump -A -F -B --single-transaction |gzip >/data/backup/$(date +%F).tar.gz
特別注意:
1--single-transaction僅適用於InnoDB引擎。
 
生產環境mysqldump備份命令
mysqldump –u root –p –S /data/3306/mysql.sock –default-character-set=gbk –single-transaction –F –B oldboy|gzip > /server/backup/mysql_$(date +%F).sql.gz
 
:
-F:刷新bin-log參數,數據庫備份完以後,會刷新bin-log
 
增量備份:
更新bin-log:
mysqladmin –uroot –p –S /data/3306/mysql.sock flush-logs
如生成mysql-bin.000004文件
把生成的最新mysql-bin.000004文件,CP/var/backup/
把二進制的日誌生成 sql語句:
mysqlbinlog mysql-bin.000004>bin04.sql
如果有多個庫,我們應該用-d來指定恢復單個庫
mysqlbinlog mysql-bin.000004 –d oldboy >binlog.sql  (當然對於庫也要分庫備,否則恢復還是麻煩)
還原數據:先還原全備,再還原增備
先還原全備:mysql –u root –p  <mysql
file.sql
還原增備:mysql –u root –p  <binlog.sql(恢復增備的時候,需要把誤操作的語句刪掉後,再還原,否則,還原後,還是會和誤操作後一樣)
 
基於時間點的增量恢復
mysqlbinlog mysql-bin.000004 –start-datetime=’2011-03-19 025854’—stop-datetime=’2011-03-19 032244’ –r time.sql
上面語句將顯示2011.03-19 02:58:54-----2011-03-19 03:22:44時間段的binlog,並輸出到time.sql

拽定開始時間到文件結束
mysqlbinlog mysql-bin.000004 –start-datetime=’ 2011-03-19 025854’ –d oldboy –r time.sql
這個語句只有開始時間,那麼就是從2011-03-19 025854時刻到日誌結尾,lodboy數據庫的binlog輸出到time.sql
 
基於位置點的增量恢復
指定開始位置和結束位置
mysqlbinlog mysql-bin.000004 –start-position=510 –stop-position=1312 –r pos.sql
輸出初始位置510,結束位置1312的所有binlog日誌到pos.sql
注意:結尾的日誌點細弱特殊不會被包含。即輸出1312pos以前的binlog
指定開始位置到文件結束
mysqlbinlog mysql-bin.000004 –start-position=510 –r pos510-end.sql
輸出初始位置510,結束位置到文件結尾的所有binlogpos510-end.sql。當然,你也可以指定庫名輸出binlog。如:
mysqlbinlog mysql-bin.000004 --start-position=510 –r pos510-end-oldboy.sql –d oldboy
從文件開頭到指定結束位置
mysqlbinlog mysql-bin.000004 --stop-position=954 -r start-954.sql
輸出從文件開始位置,到954位置截止的所有binlog

掌握和查找打開的文件
lsof(列出打開的文件)實用程序會顯示打開的文件名。其選項僅顯示某些進程,只有一個進程的某些文件描述符,或只有某些網絡連接(網絡連接使用文件描述符,就像普通文件一樣,lsof 也顯示這些)。使用 ps – ef 確定了可疑進程後,輸入以下命令:

 # lsof -s -p pid

服務器最大設置的連接數:151
mysql> show variables like'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
1 row in set (0.00 sec)
 
服務器響應的最大連接數:152
mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 152   |
+----------------------+-------+
1 row in set (0.00 sec)
查看服務器key_buffer_size數值:402653184
mysql> show variables like 'key_buffer_size';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| key_buffer_size | 402653184 |
+-----------------+-----------+

1 row in set (0.00 sec)
 
查看服務器現在使用的key_buffer_size使用情況:
key_read_requests: 879600044
key-reads: 830525
mysql> show global status like 'key_read%';
+-------------------+-----------+
| Variable_name     | Value     |
+-------------------+-----------+
| Key_read_requests | 879600044 |
| Key_reads         | 830525    |
+-------------------+-----------+
2 rows in set (0.00 sec)
計算索引未命中的概率:
key_cache_miss_rate =  key_reads / key_read_requests * 100%
達到0.1%以下(即每1000個請求有一個直接讀硬盤)以下都很好,如果key_cache_miss_rae0.01%以下的話,則說明key_buffer_size分配得過多,可以適當減少。
 
 
Key_blocks_unused表示未使用的緩存簇數,Key_blocks_used表示曾經用到的最大的blocks數,比如這臺服務器,所有的緩存都用到了,要麼增加key_buffer_size,要麼就是過度索引,把緩存佔滿了。比較理想的設置是:
key_blocks_used / ( key_blocks_unused + key_blocks_used ) * 100 % = 80%
 
mysql> show global status like 'key_blocks_u%';
+-------------------+--------+
| Variable_name     | Value  |
+-------------------+--------+
| Key_blocks_unused | 317003 |
| Key_blocks_used   | 6439   |
+-------------------+--------+
2 rows in set (0.00 sec)
 
 
臨時表:
當執行語句時,關於已經被創造了的隱含臨時表的數量,我們可以用如下命令查詢其具體情況:
mysql> show global status like 'created_tmp%';

+-------------------------+--------+
| Variable_name           | Value  |
+-------------------------+--------+
| Created_tmp_disk_tables | 343326 |
| Created_tmp_files       | 172    |

| Created_tmp_tables      | 675795 |
+-------------------------+--------+
3 rows in set (0.00 sec)
 
每次創建臨時表時,created_tmp_tables都會增加,如果是在磁盤上創建臨時表,created_tmp_disk_tables也會增加。created_tem_files表示MYSQL服務創建的臨時文件數,比較理想的配置是:
Created_Tmp_disk_tables / Created_tmp_tables * 100% <= 25%
比如上面服務器Created_Tmp_disk_tables / Created_tmp_tables * 100% = 50%,比較差了。
我們再看一下
MYSQL服務器對臨時表的配置:
mysql> show variables where Variable_name in ('tmp_table_size','max_heap_table_size');
+---------------------+----------+
| Variable_name       | Value    |
+---------------------+----------+
| max_heap_table_size | 16777216 |
| tmp_table_size      | 16777216 |
+---------------------+----------+
2 rows in set (0.00 sec)
只有16M以下的臨時表才能全部放在內存中,超過的就會用到硬盤臨時表。
 
 
 
打開表的情況
Open_tables表示打開表的數量,Opend_tables表示打開過的表數量,我們可以用如下命令查看其具體情況:
mysql> show global status like 'open%tables%';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| Open_tables   | 512    |
| Opened_tables | 234200 |
+---------------+--------+
2 rows in set (0.00 sec)
如果Opened_tables數量過大,說明配置中tables_caceh(MYSQL 5.1.3 之後這個值叫做table_open_cache)的值可能太小。我們查詢一下服務器table_cache值:
mysql> show variables like 'table_open_cache';          
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| table_open_cache | 614   |
+------------------+-------+
1 row in set (0.00 sec)

比較合適的值爲:
Open_tables / Opened_tables * 100% >= 85%
Open_tables / table_open_cache * 100% <= 95%
 
 
進程使用情況
如果我們在MYSQL服務器的配置文件中設置了thread-cache_size,當客戶端斷開之時,服務器處理此客戶請求的線程將會緩存起來以響應下一個客戶而不是銷燬(前提是緩存數未達上限)。Threads_created表示創建過的線程數,我們可以用如下命令查看:
mysql> show global status like 'Thread%';

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 7     |
| Threads_connected | 2     |
| Threads_created   | 2124  |
| Threads_running   | 2     |
+-------------------+-------+
4 rows in set (0.00 sec)
如果發現Threads_created的值過大的話,表明MYSQL服務器一直在創建線程,這也是比較耗費資源的,可以適當增大配置文件中的thread_cache_size的值。查詢服務器thread_cahce_size配置,如下所示:
mysql> show variables like 'thread_cache_size';

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| thread_cache_size | 8     |
+-------------------+-------+
1 row in set (0.00 sec)
 
 
查詢緩存
它涉及的主要有兩個參數,query_cache_size是設置MYSQL的Query_Cache大小,query_cache_size是設置使用查詢緩存的類型,我們可以用如下命令查看其具體情況:
mysql> show global status like 'qcache%';

+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 130      |
| Qcache_free_memory      | 31557680 |
| Qcache_hits             | 15838885 |
| Qcache_inserts          | 2391041  |
| Qcache_lowmem_prunes    | 0        |

 
| Qcache_not_cached       | 671718   |
| Qcache_queries_in_cache | 676      |
| Qcache_total_blocks     | 1798     |
+-------------------------+----------+
8 rows in set (0.00 sec)
 
我們再查詢一下服務器上關於query-cache的配置命令如下:
mysql> show variables like 'query_cache%';

+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 33554432 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
5 rows in set (0.00 sec)
 
 
 
排序使用情況
它表示系統中對數據進行排序時所使用的Buffer,我們可以用如下命令查看:
mysql> show global status like 'sort%';

+-------------------+-----------+
| Variable_name     | Value     |
+-------------------+-----------+
| Sort_merge_passes | 84        |
| Sort_range        | 393425    |
| Sort_rows         | 751581502 |
| Sort_scan         | 324383    |
+-------------------+-----------+
4 rows in set (0.00 sec)
 
Sort_merge_passes包括如下步驟:MYSQL首先會嘗試在內存中做排序,使用的內存大小由系統變量sort_buffer_size來決定,如果它不夠大則把所有的記錄都讀到內存中,而MYSQl則會把每次在內存中排序的結果存到臨時文件中,等 MYSQL找到所有記錄之後,再把臨時文件中的記錄做一次排序。這次再排序就會增加sort_merge_passes。實際上,MYSQL會用另一個臨時文件來存儲再次排序的結果,所以我們通常會看到sort_merge_passes增加的數值是建臨時文件數的兩倍。因爲用到了臨時文件,所以速度可能會比較慢,增大sort_buffer_size會減少sort_merge_passes和創建臨時文件的次數,但盲目地增加sort_buffer_size並不一定能提高速度。
 

 
 
文件打開數(open_files
我們在處理
MYSQL故障時,發現當open_files大於open_files_limit值時,MYSQL數據庫就會發生卡住的現象,導致APACHE服務器打不開相應頁面。這個問題大家在工作中應注意,我們可以用如下命令查看其具體情況:
mysql> show global status like 'open_files';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_files    | 901   |
+---------------+-------+
1 row in set (0.00 sec)
 
mysql> show variables like'open_files_limit';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1185  |
+------------------+-------+
1 row in set (0.00 sec)
 
比較適合的設置是:open_files / open_files_limit * 100% <= 75%
 
 
 
 
 
帶寬的大小
通常我們在架構網站的時候,會設定一些目標,比如網站每天要能承受千萬PV的訪問量,這時我們要估算一下大概需要多大的帶寬。計算帶寬大小主要的有2個主要指標(峯值流量和頁面大小),我們先做出必要的假設:
1.   峯值流量是平均流量的3倍;
2.   每次訪問平均的頁面大小是100KB左中。
如果
1000PV的訪問量在一天內平均分佈,每秒大約120次訪問,如果按平均每次訪問頁面大小是100KB字節計算,120次訪問總計大約就是12000KB。字節的單位是Byte,而帶寬單位是bit,它們之間的關係是1Byte=8bit,所以12000k Byte大致就相當於96000k bit,也就是90Mbps的樣子。實際上,我們的網站必須能在峯值流量時保持正常運行狀態,所以按照假設的峯值流量計算,真實帶寬的需求應該在270Mbps左右。


當然,這個結論是根據前面提到的兩點假設得出來的,具體值則需要根據公司實際情況來計算。
 
 
數據庫服務器是重中之重,因爲網站的瓶頸問題大多出在數據庫身上。現在一般的中小網站多使用MYSQL數據庫。一般而言,使用MYSQL數據庫的時候,我們應該配置爲一個主從(一方多從)結構,主數據庫服務器使用InnoDB表結構,從數據服務器使用MyiSAM表結構。這樣充分發揮它們各大自的優勢,而且這樣的方從分離了讀寫操作,降低了讀操作的壓力。我們還可以設定一個專門的從服務器作爲備份服務器,有時候還需要藉助
mcached/' target='_blank'>Memcached之類的第三方軟件,以便適應更大訪問量的要求。
 
 
跟蹤進程:
找其中一個 CPU 100% 的 php-cgi 進程的 PID,用以下命令跟蹤一下:
strace -p 10747
如果屏幕顯示:
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
那麼,就可以確定是 file_get_contents() 導致的問題了。
 

lsof
lsof -i :80  顯示佔用80端口的進程
lsof -p 1457 
顯示進程號爲1457的進程所打開的文件
 
查看服務器型號:
dmidecode -s system-product-name
 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章