2011年3月31日星期四

slave 1236 error

昨日, 因為從庫 down 掉, 再次啟動時, Relay_log_file 已差很遠. 只好手動同步下, 先記錄下當前的binlog_file, binlog_pos, 然後按正常步驟,
[sql]
mysql> STOP SLAVE;
mysql> RESET SLAVE;
mysql> CHANGE MASTER TO ...;
mysql> START SLAVE
[/sql]

SHOW SLAVE STATUS 提示:

Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file


報找不到日誌錯誤, 但查看日誌列表時, 指定的日誌是存在着的. 死活查不到問題出在那, 滾動鼠標滑輪時, 不小心將編輯器的字體改小, 發現 master_log_file=" mysql_bin.000011", 問題竟出這裡. 這就是不小心及偷懶的代價...

2011年3月30日星期三

查看 MySQL 慢日誌

使用 MySQL自带命令 mysqldumpslow 查看


OPTIONS

  • -s ORDER ORDER, 主要有 c, t, l, r 和 ac, at, al, ar, 分别是按照 query次数, 时间, lock的时间和返回的记录数来排序, 前面加了a时倒序.

  • -t NUM top NUM, 即为返回前面多少条的数据.

  • -g PATTERN grep: 后边可以写一个正则匹配模式, 大小写不敏感



[bash]
#查看访问次数最多的 20 个 sql 语句
[root@localhost ~]# mysqldumpslow -s c -t 20 /usr/local/mysql/var/mysql_slow_query.log
#查看返回记录集最多的 20 个 sql
[root@localhost ~]# mysqldumpslow -s r -t 20 /usr/local/mysql/var/mysql_slow_query.log
#按照时间返回前 10 条里面含有左连接的 sql 语句
[root@localhost ~]# mysqldumpslow -t 10 -s t -g "LEFT JOIN" /usr/local/mysql/var/mysql_slow_query.log
[/bash]

mysqlsla 分析 MySQL 慢查询日志



  • mysqlsla -lt slow /usr/local/mysql/var/mysql_slow_query.log slow log

  • mysqlsla -lt general /usr/local/mysql/var/mysql_query.log general log

  • mysqlbinlog /usr/local/mysql/var/mysql-bin.000001 | mysqlsla -lt binary - binary log


  • mysqlsla(现已不在维护)是第三方提供的perl脚本, 不过它功能强悍, 可以分析包括慢查询在内的多种格式的日志.
    [bash]
    [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz
    [root@localhost tmp]# tar zxf mysqlsla-2.03.tar.gz
    [root@localhost tmp]# cd mysqlsla-2.03
    [root@localhost mysqlsla-2.03]# perl Makefile.PL
    [root@localhost mysqlsla-2.03]# make
    [root@localhost mysqlsla-2.03]# make install
    [/bash]
    安装完成后, mysqlsla 会加入到 /usr/bin 目录.

    mysqlsla 会自动判断日志类型, 缺省会打印出前十条结果, 可以通过类似--top 100的参数来修改, 如果觉得每次输入麻烦, 还可以建立一个配置文件 ~/.mysqlsla, 在文件里写上:
    [bash]
    top=100
    [/bash]
    这样就不用每次都手动输入参数了.
    [bash]
    [root@localhost mysqlsla-2.03]# mysqlsla -lt slow /usr/local/mysql/var/mysql_slow_query.log
    [/bash]

    返回结果:
    [text gutter="0"]
    Report for slow logs: /usr/local/mysql/var/mysql_slow_query.log
    4 queries total, 2 unique
    Sorted by 't_sum'
    Grand Totals: Time 11 s, Lock 0 s, Rows sent 712.40k, Rows Examined 712.40k


    ______________________________________________________________________ 001 ___
    Count : 3 (75.00%)
    Time : 8 s total, 2.666667 s avg, 2 s to 4 s max (72.73%)
    Lock Time (s) : 0 total, 0 avg, 0 to 0 max (0.00%)
    Rows sent : 178.10k avg, 178.10k to 178.10k max (75.00%)
    Rows examined : 178.10k avg, 178.10k to 178.10k max (75.00%)
    Database : test
    Users :
    root@localhost : 66.67% (2) of query, 75.00% (3) of all users
    root1@localhost : 33.33% (1) of query, 25.00% (1) of all users

    Query abstract:
    SELECT * FROM test_1;

    Query sample:
    select * from test_1;

    ______________________________________________________________________ 002 ___
    Count : 1 (25.00%)
    Time : 3 s total, 3 s avg, 3 s to 3 s max (27.27%)
    Lock Time (s) : 0 total, 0 avg, 0 to 0 max (0.00%)
    Rows sent : 178.10k avg, 178.10k to 178.10k max (25.00%)
    Rows examined : 178.10k avg, 178.10k to 178.10k max (25.00%)
    Database :
    Users :
    root@localhost : 100.00% (1) of query, 75.00% (3) of all users

    Query abstract:
    SELECT * FROM test_2;

    Query sample:
    select * from test_2;
    [/text]

    釋意:

    • queries total 总查询次数

    • unique 去除重复后的 sql 数量.

    • Sorted by 输出报表的内容排序.

    • Grand Totals slow sql统计信息包括: 总执行时间, 等待锁时间, 结果行总数, 扫描行总数.

    • Count slow sql 的执行次数及占总的 slow log 数量的百分比.

    • Time 执行时间, 包括总时间, 平均时间, 最小, 最大时间, 时间占到总 slow sql 时间的百分比.

    • Lock Time 等待锁的时间.

    • Rows sent 结果行统计数量, 包括平均, 最小, 最大数量.

    • Rows examined 扫描的行数量.

    • Database 属于哪个数据库

    • Users username@hostname 占到所有用户执行该句 sql 百分比及占到所有用户执行的所有 SQL 的百分比.

    • Query abstract 精简后的sql语句



    几个常用OPTION, 其他可查看官网文档

    • --log-type=TYPE LOGS or -lt TYPE LOGS TYPE LOGS 可为 slow, general, binary, msl or udl. 官方文档说是没有指定时, 会根据给定的日志文件自动检测, 但测试时失败, so, 最好指定该参数.
      msl 是指 microslow patched 的慢日志.
      udl 用户自定义的日志.
      binary 因为 mysqlsla 不能直接解析 MySQL 的 binary log, 所以需先用 mysqlbinlog命令将其解析为文本,. mysqlbinlog 带有 --short-form参数时, 则 LOG TYPE 需指定为 udl. 命令可类似于如下:
      [bash]
      mysqlbinlog /usr/local/mysql/var/mysql-bin.000001 | mysqlsla -lt binary -
      mysqlbinlog --short-form /usr/local/mysql/var/mysql-bin.000001 | mysqlsla -lt udl -
      [/bash]

    • --explain or -ex explain 每句 SQL, 默认没有启用

    • --databases=dbname1,dbnam2[,...] or -db dbname1,dbnam2[,...] or -D dbname1,dbnam2[,...]用于 --explain

    • --flush-qc 强制刷新查询缓存, 默认没有启用

    • --grep="PATTERN" 只解析满足条件的 SQL

    • --meta-filter="CONDTIONS" or -mf "CONDTIONS" CONDITIONS 格式为[meta][op][value],多个条件时, 中间以,分割.
      [meta] 查看这里
      [op] >, < or =. 當 [meta] 是基於字符串時 , [op] 只能是 =.
      [value] 數字 or 字符串.

    • --reports=REPORTS or -R REPORTS, 默認是 standard, REPORTS 可以是以,為分割的列表. 可選選項:standard, time-all, print-unique, print-all, dump




    NOTE


    • MySQL 5.1.21 及以后版本可通过 set [session|global] long_query_time=0.01 等来设置记录执行时间超过 0.01秒 以上的 sql 语句.v5.1.21 之前的版本最小值只能到达 1s, 这时候可用 microslow patch(msl patch ) 补丁来完成这一工作.

2011年3月25日星期五

Windows 下命令端启动,停止 MySQL 服务

Windows 下命令端启动,停止 MySQL 服务.
[bash]
net start mysql
[/bash]
启动 MySQL 服务.

[bash]
net stop mysql
[/bash]
停止 MySQL 服务.

昨日, 在 Windows 下做修改某配置的测试,启动服务时,条件反射的使用 mysqld_safe,失败才记起得用如上命令来启动。记录下以备来时又昏头.

删除查看二进制日志

删除


PURGE {MASTER | BINARY} LOGS TO 'binlog-name';
删除 binlog-name 编号之前所有的日志.

PURGE {MASTER | BINARY} LOGS BEFORE 'date';
除当前使用日志外, 如果其他日志最后更新时间是小于 date, 则会被删除.

[sql]
mysql> PURGE MASTER LOGS TO 'mysql-bin.000003';
Query OK, 0 rows affected (0.01 sec)
[/sql]
删除 000003 之前所有的日志(000003 不会被删除).
[sql]
mysql> PURGE MASTER LOGS BEFORE '2011-03-25 23:59:59';
Query OK, 0 rows affected (0.05 sec)
[/sql]

expire_logs_days
MySQL 可以根據 expire_logs_days 的設置自動清除日誌。該值默認為 0, 即不會自動清除。可能的值為 0-99.
配置文件中設置
[bash]
[mysqld]
expire_logs_days=1
[/bash]

命令端設置
[sql]
mysql> SET GLOBAL expire_logs_days=1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'expire%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 1 |
+------------------+-------+
1 row in set (0.00 sec)
[/sql]

The number of days for automatic binary log file removal. The default is 0, which means “no automatic removal.” Possible removals happen at startup and when the binary log is flushed. Log flushing occurs as indicated in


清空二进制日志
[sql]
mysql> RESET MASTER
[/sql]
该命令会删除之前所有的 binlog, 并重新生成新的 binlog, 后缀又会从 000001 开始. 但如果该库为主库, 且有连接从库, 而从库正在读取试图删除的日志之一,
则本语句不会起作用, 而是会失败, 并伴随一个错误. 不过, 如果从库没有连接主库, 而又删除了从库读取的日志, 则从库启动后不能复制. 当从库正在复制时, 本语句可以安全运行, 不需要停止它们.


查看当前二进制日志


[sql]
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000009 | 180 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)
[/sql]

更新二进制


[sql]
mysql> FLUSH LOGS;
[/sql]

查看二进制日志数目


[sql]
mysql> SHOW MASTER LOGS;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 117 |
| mysql-bin.000002 | 117 |
| mysql-bin.000003 | 1181 |
| mysql-bin.000004 | 491718 |
| mysql-bin.000005 | 2543824 |
| mysql-bin.000006 | 8032840 |
+------------------+-----------+
16 rows in set (0.01 sec)
[/sql]
列出所有的日志及其大小

查看 events


[sql]
mysql> SHOW BINLOG EVENTS;
[/sql]
MySQL 命令终端查看当前日志中记录的日志.

mysqlbinlog
[bash]
[root@localhost ~]# mysqlbinlog /usr/local/mysql/var/mysql-bin.000001
[/bash]
查看二进制文件 mysql-bin.000001 中记录的 DML 和 DLL.

mysqlbinlog 有用参数

  • -d, --database=dbname 列出查看的数据库

  • --start-datetime='2011-03-25 00:00:00' 查看发生在该指定时间之后的 events.

  • --stop-datetime='2011-03-25 23:59:59' 查看发生在该指定时间之前的 events.

  • --start-position=10 查看该指定偏移点之后的 events.

  • --stop-position=100 查看该指定偏移点之前的 events.

  • --set-charset=utf8 在输出的 events 之前添加上 "SET NAMES utf8".




基于时间
[bash]
[root@localhost ~]# mysqlbinlog --start-datetime='2011-03-25 00:00:0' --stop-datetime='2011-03-25 23:59:59' --database=test /usr/local/mysql/var/mysql-bin.000001 > /tmp/1.log
[/bash]
> /tmp/1.log 将其重定向到 1.log, 更便于查看.


基于偏移量
[bash]
[root@localhost ~]# mysqlbinlog --start-position=98 --stop-position=344 --database=test /usr/local/mysql/var/mysql-bin.000001 > /tmp/1.log
[/bash]

2011年3月24日星期四

MySQL 日志

在 MySQL 中有 4 种不同的日志, 分别为错误日志, 查询日志慢查询日志, 二进制日志. 默认情况下, 为尽量减少 IO 损耗, 系统只打开错误日志. 若需要复制, 就必须要打开二进制日志.

错误日志


错误日志在 MySQL 数据库中很重要, 它记录着 MySQL 启动和停止, 以及服务器在运行过程中发生的任何错误的相关信息.

配置
如果配置文件 my.cnf 没有指定 log_eror, 则错问日志默认文件名为 hostname.err, 存放于 datadir 目录中.
[sql]
mysql> SHOW VARIABLES LIKE 'log_error';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_error | |
+---------------+-------+
1 row in set (0.00 sec)
[/sql]

将 log-error 配置到 my.cnf 文件中
[bash]
[mysqld]
log_error=/usr/local/mysql/var/mysql-error.err
[/bash]


查询日志


查询日志记录了所有操作的语句. 由于它记录数据库所有操作, 对于访问频繁的系统, 此种日志会造成性能影响, 所以一般不会将其打开.

配置
如果配置文件 my.cnf 有打开log选项, 但未指定具体文件名和路径, 则其默认文件名为 hostname.log, 存放于 datadir 目录中.

默认时查询日志变量值
[sql]
mysql> SHOW VARIABLES LIKE 'log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log | OFF |
+---------------+-------+
1 row in set (0.00 sec)
[/sql]

如果有需要使用到查询日志, 将 log 配置到 my.cnf 文件中
[bash]
[mysqld]
log=/usr/local/mysql/var/mysql_query.log
[/bash]

查询日志是纯文本格式, 可使用文本读取工具直接打开查看.

慢查询日志


慢查询日志是记录执行时间超过参数 slow_launch_time(unit: s, v5.1 默认 2s v5.0.* 是 long_query_time)所设定值的 SQL 语句日志. 它有助于发现性能有问题的 SQL.

打开慢日志对系统性能的整体影响没有 binlog 那么大, 但系统需要计算每一条查询的执行时间, 所有, 在 CPU 方面还是有损耗的. 如果 CPU 资源不够, 可在大部分时候关闭这个, 只需间断性的打开来定位可能存在的慢查询.

配置
如果配置文件 my.cnf 有打开log_slow_queries选项, 但未指定具体文件名和路径, 则其默认文件名为 hostname-slow.log, 存放于 datadir 目录中.

默认情况下慢日志查询变量(v5.1):
[sql]
mysql> SHOW VARIABLES LIKE '%slow%';
+---------------------+----------------------------------+
| Variable_name | Value |
+---------------------+----------------------------------+
| log_slow_queries | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /usr/local/mysql/var/db-slow.log |
+---------------------+----------------------------------+
4 rows in set (0.00 sec)
[/sql]

如果有需要使用到慢查询日志, 将 log_slow_queries 配置到 my.cnf 文件中
[bash]
[mysqld]
log_slow_queries=/usr/local/mysql/var/mysql_slow_query.log
[/bash]

也可以在启动 MySQL 服务时, 加上 --log_slow_queries=filename.log

若需要进一步缩短慢查询时间限制, 可使用 Percona 提供的 microslow-patch(msl Patch). 它不仅能将时间减小到毫秒级别, 还能通过一些特定的规则来过滤记录的SQL, 如只记录某个表的慢查询.

查看慢日志

二进制日志


二进制日志记录了所有的 DDL 和 DML 的语句, 但不包括查询语句, 语句以事件方式保存, 此日志对发生灾难时数据恢复极为重要. MySQL 复制时, 必须将其打开.

启用配置
[bash]
[mysqld]
log-bin=/usr/local/mysql/var/mysql-bin
[/bash]

mysql-bin 为日志文件名,MySQL 在文件名后添加数字索引,所以该文件最后的形式类似于 mysql-bin.000001.如果在指定文件名时类似于 myql-bin.log, .log 会自动忽略. 该日志没有指定相对路径时,默认存放于 datadir 目录中.

如下情况时,二进制日志会更换到新的文件:

  • 服务器重启

  • 服务器被更新

  • 日志达到最大日志长度 max_binlog_size

  • 在 MySQL 命令终端 FLUSH LOGS




打开配置时各变量值(v5.1)
[sql]
mysql> SHOW VARIABLES LIKE '%bin%';
+-----------------------------------------+----------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------+
| binlog_cache_size | 32768 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | STATEMENT |
| binlog_stmt_cache_size | 32768 |
| innodb_locks_unsafe_for_binlog | OFF |
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| sql_log_bin | ON |
| sync_binlog | 0 |
+-----------------------------------------+----------------------+
12 rows in set (0.00 sec)
[/sql]

部分变量值说明

  • binlog_cache_size 事务过程中容纳二进制日志 SQL 语句的缓存大小. 二进制日志缓存是服务器支持事务存储引擎, 且服务器启用了二进制日志(log_bin)的前提下为每个客户端分配的内存, 注意是给每个客户端可以分配设置大小的 binlog cache 空间. 如果系统中会出现多语句的事务, 增加该值的大小, 以得到更好的性能.

  • max_binlog_cache_sizebinlog_cache_size对应, 它代表的是 binlog 能使用的最大 cache 值大小. 当不够大时, 系统可能会报“Multi_statement transaction required more than 'max_binlog_cache_size' bytes of storage".

  • max_binlog_size binlog 最大值, 一般设置为 512KB 或 1GB, 但不能超过 1GB.

  • sync_binlog影响到 binlog 对 MySQL 所带来的性能消耗, 还影响到数据的完整性, 参数说明如下:
    sync_binlog=0 事务提交后, 仅仅是将 binlog_cache 中的数据写入到 binlog 文件中, 但不执行 fsync 之类的磁盘操作指令通知文件系统将缓存刷新到磁盘, 而让文件系统自行决定什么时候来同步. sync_binlog=N 进行 N 次事务提交后, 系统将执行一次 fsync 之类的磁盘同步指令, 通知文件系统将 binlog 文件的缓存刷新到磁盘. 默认是 sync_binlog=0, 性能是最好, 但是风险是最大, 因为一旦系统 crash, 文件系统缓存中的 binlog 将都会丢失.设置为 1 时, 最安全但性能损耗最大, 当系统 crash 时, 最多只会丢失 binlog_cache 中未完成的一个事务, 对实际数据没有任何的影响.sync_binlog=0 性能 有可能是 sync_binlog=1 时的5倍.




记录内容配置
binlog_do_db=example1,example2 设定那些 db 需要记录binlog
binlog_ignore_db=test1,test2 设定那些 db不要记录 binlog

注:
如果在操作数据库之前,不使用use $dbname , 那么所有的SQL都不会记录, 如果使用了use $dbname,那么判断规则取决于这里的$dbname,而不是 SQL 中操作的库.

如果配置文件中没有配置这两个选项,则该主机上所有库的 DML 和 DLL 语句都会被记录。
删除查看二进制日志

2011年3月23日星期三

Linux Commands

FROM: Linux Command


文件命令



  • ls 列出目录下的文件和文件夹

  • ls -al 已列表方式列出目录下的文件和文件夹,包括隐藏文件

  • cd dir 将目录切换到 dir

  • cd ~ 切换到用户目录

  • pwd 打印当前目录

  • mkdir dir 新建 dir 目录

  • rm file 删除 file 文件

  • rm -r dir 删除 dir 目录及其子目录

  • rm -f file 强制删除 file 文件

  • rm -rf dir 强制删除 dir 目录及其子目录

  • rm -rf / 这个就不用说了,该命令敲完再回车下,系统就玩完了

  • cp file1 file2 将 file1 复制到 file2

  • mv file1 file2 将 file1 重命名为file2

  • ln -s file link 为文件 file 在另外一个位置建立一个软链接

  • touch file 创建名为 file 的文件,如果该文件已存在,则更新其文件的时间戳, 之前文件内容并不会丢失。

  • cat > file 创建新文件,并接下来的键盘输入重定向到 file 文件,直到退出该输入。

  • more file 分页显示 file 的内容, 支持 ctrl+B ctrl+F .....上下滚屏,但不支持像shift+G(跳到文件尾)这种操作

  • less file 分页显示 file 的内容,支持各种命令, 随便翻页,跳转,查找...

  • head file 显示文件 file 的前 10 行内容

  • tail file 显示文件 file 的最后1 10 行内容

  • tail -f file 实时显示文件 file 的最后 10 行内容



SSH



  • ssh user@host 连接远程主机

  • ssh -p port user@host 连接远程主机上的 port。 不用这个选项,默认就是22

  • ssh -D port user@host 使用非特定的 port 去对外联机。如果被访问机器的防火墙不淮许从特定的 port 联机,就可以使用这个选项。这个选项会关掉 RhostsAuthenticationRhostsRSAAuthentication



安装软件



  • ./configure

  • make

  • make install



网络



  • ping host 测试本机和目标主机的连通状况

  • whois domain 查找并显示指定域名的用户相关信息

  • dig domain 查找域 domain 的 DNS 服务器

  • dig -x host 查看反向解析

  • wget file 从网络上自动下载 file

  • wget -c file 断点下传 file

  • wget -r url 从 url 递归下载文件



系统信息



  • date 显示当前时间

  • cal 显示当月日历

  • uptime 查询系统当前负载

  • w 用于显示登录到系统的用户情况

  • whoami 显示当前用户名

  • uname -a 显示系统所有信息

  • cat /proc/cpuinfo 查看 CPU 的相关信息

  • cat /proc/meminfo 查看内存的信息

  • man command 显示 command 的手册

  • df 检查文件系统的磁盘空间占用情况

  • du 查询文件或目录的磁盘使用空间

  • du -sh 以易读方式显示当前目录所使用空间, 进制为 1024(忽略子目录)

  • free 显示当前内存及其 swap 的信息

  • whereis app 用于程序名的搜索,而且只搜索二进制文件(参数-b), man说明文件(参数-m)和源代码文件(参数-s)

  • which app 在 $PATH 变量指定的路径中,搜索 app 系统命令的位置,并且返回第一个搜索结果



查找文件




进程管理



  • ps 列出系统中正在运行的进程

  • ps aux   列出所有使用者的进程

  • kill pid 杀死 pid 为 pid 的进程

  • killall proc杀死所有名为 proc 的进程

  • bg 将一个在后台暂停的命令,变成继续执行. 如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过 jobs 命令查到的后台正在执行的命令的序号(不是pid)

  • fg 将后台中的命令调至前台继续运行, 如果后台中有多个命令,可以用 fg %jobnumber 将选中的命令调出,%jobnumber 是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

  • fg n 把 job n 调回到前台执行

  • jobs 查看当前有多少在后台运行的命令,若未指定jobsid,则显示所有活动的任务状态信息; 如果报告了一个任务的终止(即任务的状态被标记为Terminated)SHELL 从当前的 SHELL 环境已知的列表中删除任务的进程标识



文件权限


chmod octal file - 修改文件的权限
4 - read(r)
2 - write(w)
1 - execute(x)
order: owner/group/world
eg:
chmod 777 - 每个人都有写,读,执行的权限
chmod 755 - 用户的创建者有所有的权限,同组/其他组有写读的权限

压缩



  • tar cf file.tar files 将 files 全部以 tar 方式 压缩到 file.tar

  • tar xf file.tar 将 file.tar 解压到当前目前目录

  • tar tf file.tar 列出 file.tar 压缩包中的文件



tar OPTIONS

  • c 创建新的档案文件,不可与x, t同时使用

  • t 列出档案文件中的文件, 不可与x, c同时使用

  • x 解压, 不可与c, t同时使用

  • f 使用档案文件或设备,该选项通常是必选的, 该参数后必须直接接档案名

  • z 用 zip/gzip 来压缩/解压缩 文件,加上该选项后可将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩

  • j 用 bzip2 来压缩/解压缩 文件,加上该选项后可将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩

  • k 保存已经存在的文件。即如果把某个文件还原,遇到相同的文件,不会进行覆盖

  • T 从文件中得到要展开或要创建的文件名

  • w 每一步都要求确认

  • v 详细报告 tar 处理的文件嘻嘻你,如故此选项,tar 不报告文件信息

  • r 附加到存档




gzip file - 用 gzip 压缩文件,压缩完后,原文件会删除
gzip -d file.gz - 解压


快捷方式



  • ctrl+c 终止当前进程

  • ctrl+z 挂起当前进程

  • fg 将后台中的命令调至前台继续运行

  • bg 将一个在后台暂停的命令,变成继续执行

  • ctrl+d 退出当前 SHELL

  • ctrl+w 擦除当前命令行字符

  • ctrl+r 方向搜索执行过的命令

  • !! 重复上条命令

  • exit 退出当前 SHELL



VIM


退出

  • :x 退出并保存修改

  • :wq 退出并保存修改

  • :q 没有修改的情况下,可退出

  • :q! 强制退出,忽略修改



插入文本

  • i 进入命令模式输入

  • I 行首插入

  • a 字符后面插入追加文本

  • A 行尾插入

  • o 光标下新建空行

  • O 光标上新建空行

  • r 取代光标所在的那一个字符

  • R 取代光标所在的文字,直到按 ESC 为止



移动光标

  • h 向左移动

  • j 向下移动

  • k 向上移动

  • l 向右移动

  • w 移动光标到下一个单词

  • W 移动光标到下一个单词

  • b 移动光标到前一个单词

  • B 移动光标到前一个单词

  • e 移动光标到下个单词的末尾

  • E 移动光标到下个单词的末尾

  • ( 移动光标到当前句首

  • ) 移动光标到下一句开始

  • { 移动光标到段开始

  • } 移动光标到下一段开始

  • 0 移动光标到行开始

  • $ 移动光标大行尾

  • nG 移动光标到第 n 行

  • :n 移动光标到第 n 行

  • G 移动光标到最后一行

  • fc 移动光标到前一个 c

  • Fc 移动光标到下一个 c

  • H 移动光标到屏幕的顶部

  • M 移动光标到屏幕的中部

  • L 移动光标到屏幕的底部

  • % 移动光标到配对的(), {}, []



删除文本

  • x 删除当前字符

  • X 删除光标前一个字符

  • D 删除当前到行尾的所有字符

  • dd 删除当前行

  • :d 删除当前行

  • dG 删除当前到文件末

  • dgg 删除当前到文件首



搜索

  • /string 向下搜索字符串 string

  • ?string 向上搜索字符串 string

  • n 在同一方向重复上一次搜索命令

  • N 在反方向上重复上一次搜索命令



替换

  • :s/pattern/string/flags 根据flags, 将当前行中所有pattern 均用 string 替代

  • g flag, 替换所有匹配的

  • c flag, 确定是否进行替换

  • & 重复上一次 替换 命令



files

  • :w file 保存文件

  • :r file 读入 file 内容到当前位置后

  • :n 打开多个文件时,将当前文件转到下一个(先保存当前文件)

  • :e file 打开另外一个文件 file (打开新文件前,先保存当前文件)

  • :! cmd 运行命令 cmd 后,返回到编辑器中

  • !! cmd 将运行命令 cmd 返回的结果体换当前行



other

  • u 恢复最后一个指令之前的结果,可以多次撤消指令,一次撤消一个操作,直至本次操作开始为止

  • U 恢复光标所在行所有改变

Optimize InnoDB Table

新上的服务器, 优化表失败.

上官方网站看了下 v5.1 优化表一章, 里面正好有提到遇到的问题:

For InnoDB tables, OPTIMIZE TABLE is mapped to ALTER TABLE, which rebuilds the table to update index statistics and free unused space in the clustered index. Beginning with MySQL 5.1.27, this is displayed in the output of OPTIMIZE TABLE when you run it on an InnoDB table, as shown here:
[sql]
mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
[/sql]


It is because the table that you are using is InnoDB.

You can optimize the InnoDB tables by using this.

[sql]
ALTER TABLE table.name ENGINE='InnoDB';
[/sql]

You can make OPTIMIZE TABLE work on other storage engines by starting mysqld with the --skip-new or --safe-mode option. In this case, OPTIMIZE TABLE is just mapped to ALTER TABLE.





注:
[bash]
[root@localhost ~]# /usr/local/mysql/libexec/mysqld --verbose --help
[/bash]

结果中有对 --skip-new--safe-mode选项的描述

  • --skip-new Don't use new, possible wrong routines.

  • --safe-mode Skip some optimize stages (for testing).

2011年3月17日星期四

iostat

FROM: iostat来对linux硬盘IO性能进行了解

iostat 是sysstat 一组件, 用来即时显示系统, 比如 自从系统启动开始的 CPU 平均时间 (与 uptime相似) 和整个系统, 适配器, tty 设备, 磁盘 etc 的输入/输出统计信息.

iostat [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [interval [ count ] ]


OPTION

  • -c 显示 CPU 使用的相关信息

  • -d 显示磁盘使用的相关信息

  • -h-n参数时, 以易读的方式显示 NFS 的相关信息

  • -k 以 KB/s 为单位代替 blocks/s 显示统计信息. NOTE: kernel >= v2.4, 数据才能正确显示

  • -m 以 MB/s 为单位代替 blocks/s or KB/s 显示统计信息. NOTE: kernel >= v2.4, 数据才能正确显示

  • -N 显示映射的设备信息, 用于查看 LVM2 的统计信息

  • -n 显示 NFS 的统计信息NOTE: kernel >= v2.6.17

  • -p [ { device [,...] | ALL } ] 显示系统所用到的块设备 or 指定的设备及其分区的统计信息. NOTE: kernel = v2.5

  • -t 输出的每一行边上的时间戳记. 时间戳格式由环境变量 S_TIME_FORMAT所决定

  • -V 显示版本信息

  • -x 显示扩展信息. NOTE: 因为其需要 /proc/diskstats 文件 or 挂载 sysfs, 所以 kernel = v2.5. 但如果 kernel 有 patch /proc/partitions, 老版本 kernel(e.g. 2.4) 也可以选用该参数

  • -z 测试时段时, 如果设备的输出不处于 activity 状态, 则将其忽略

  • interval 参数指定在每个报告之间的以秒计算的时间量. 第一份报告包含了自系统启动 (引导) 以来的时间统计信息. 每一份后继报告都包含在和前一份报告的时间间隔之间收集的统计信息

  • count 参数可被指定来连接 interval 参数. 如果指定了 count 参数, 它的记数值就确定在 interval 秒间生成的报告数. 如果指定了 interval 参数但没有 count 参数, iostat 命令就会不断生成报告



输出解析

对于kernel 2.4, iostat 的数据的主要来源是 /proc/partitions, 而对于kernel 2.6, 数据主要来自 /proc/diskstats 或 /sys/block/[block-device-name]/stat.

/proc/partitions 信息
[bash]
[root@localhost ~]# cat /proc/partitions
major minor #blocks name

3 0 11534336 hda
3 1 522081 hda1
3 2 2096482 hda2
3 3 8908042 hda3
[/bash]

  • major 主设备号, 3 代表 hda

  • minor 次设备号, 1 代表 No.1 分区

  • #blocks 设备总块数 (1024 bytes/block), 11 534 336 * 1024 = 11 811 160 064(bytes) ~ 1G

  • name 设备名称, e.g. hda1




iostat 输出结果
[bash]
[root@localhost ~]# iostat
Linux 2.6.18-92.el5 (localhost.localdomain) 03/17/2011 _i686_ (1 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.03 0.13 0.03 0.00 99.78

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
hda 0.88 0.25 10.86 2282383 100713668
[/bash]

CPU 使用情况
CPU 值是所有处理器的总平均, 同时, I/O 等待状态是系统级定义的, 而不是每个处理器.

  • %user 显示用户级别(应用) 所占用 CPU 的百分比

  • %nice 显示拥有 nice 优先级用户所占用 CPU 的百分比

  • %system 显示系统级别(内核) 所占用 CPU 的百分比

  • %iowait 显示等待 IO 所占用 CPU 的百分比

  • %steal

  • %idle 显示空闲 CPU 的百分比



磁盘使用情况

  • tps 设备每秒钟传输的数量(每秒钟 I/O 的请求数). 多个单独的 I/O 请求看合并到一个传输请求中, 因为每个传输请求可以有不同的大小

  • Blk_read/s Blk_wrtn/s 每秒钟块设备读写块的数量. 可设置不同的块大小, 一般为1024, 2048, 4048字节, 取决于分区的容量.

  • Blk_read Blk_wrtn 显示自系统启动后读写块的总数


对于配置有大量磁盘的大型系统配置, 当 iostat 没有执行时, 系统可以设置为避免收集物理硬盘的 I/O 数据. 如果系统用上述的方式配置, 那么第一个磁盘报告将显示消息引导不可用后 的磁盘历史记录而不是磁盘统计信息. 由 iostat 命令生成的后继时间间隔报告包含在报告时间间隔期间收集的磁盘统计信息. 引导后的任何 tty 和 CPU 都不会影响. 如果一个系统管理命令用来重新保留磁盘统计信息, 那么第一个 iostat 命令报告会显示从启用磁盘输入/输出统计信息那一刻时间间隔起点起的行为.


注: 可使用如下命令来获得 /dev/hda1 的块大小
[bash]
[root@localhost ~]# dumpe2fs -h /dev/hda1 | grep -F "Block size"
dumpe2fs 1.39 (29-May-2006)
Block size: 1024
[/bash]

iostat -x 输出结果
[bash]
[root@localhost ~]# iostat -x
Linux 2.6.18-92.el5 (localhost.localdomain) 03/17/2011 _i686_ (1 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.03 0.13 0.03 0.00 99.78

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
hda 0.00 0.49 0.01 0.87 0.25 10.86 12.62 0.00 4.51 0.91 0.08
[/bash]


  • rrqm/s 每秒进行 merge 的读操作数目, 即 delta(rmerge)/s

  • wrqm/s 每秒进行 merge 的写操作数目, 即 delta(wmerge)/s

  • r/s 每秒完成的读 I/O 设备次数, 即 delta(rio)/s

  • w/s 每秒完成的写 I/O 设备次数, 即 delta(wio)/s

  • rsec/s 每秒读扇区数, 即 delta(rsect)/s

  • wsec/s 每秒写扇区数, 即 delta(wsect)/s

  • rkB/s 每秒读 K 字节数, 是 rsect/s 的一半, 因为每扇区大小为 512 字节

  • wkB/s 每秒写 K 字节数, 是 wsect/s 的一半

  • avgrq-sz 平均每次设备 I/O 操作的数据大小 (扇区), 即 delta(rsect+wsect)/delta(rio+wio)

  • avgqu-sz 平均 I/O 队列长度, 即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)

  • await 平均每次设备 I/O 操作的等待时间 (毫秒), 即 delta(ruse+wuse)/delta(rio+wio)

  • svctm 平均每次设备 I/O 操作的服务时间 (毫秒), 即 delta(use)/delta(rio+wio)

  • %util 一秒中有百分之多少的时间用于 I/O 操作, 或者说一秒中有多少时间 I/O 队列是非空的, 即 delta(use)/s/1000 (因为use的单位为毫秒)




I/O 系统 VS 超市排队


举一个例子, 我们在超市排队 checkout 时, 怎么决定该去哪个交款台呢? 首当是看排的队人数, 5个人总比20人要快吧? 除了数人头, 我们也常常看看前面人购买的东西多少, 如果前面有个采购了一星期食品的大妈, 那么可以考虑换个队排了. 还有就是收银员的速度了, 如果碰上了连钱都点不清楚的新手, 那就有的等了. 另外, 时机也很重要, 可能 5 分钟前还人满为患的收款台, 现在已是人去楼空, 这时候交款可是很爽啊, 当然, 前提是那过去的 5 分钟里所做的事情比排队要有意义 (不过我还没发现什么事情比排队还无聊的).

I/O 系统也和超市排队有很多类似之处:

  • r/s+w/s 类似于交款人的总数

  • 平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数

  • 平均服务时间(svctm)类似于收银员的收款速度

  • 平均等待时间(await)类似于平均每人的等待时间

  • 平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少

  • I/O 操作率 (%util)类似于收款台前有人排队的时间比例



我们可以根据这些数据分析出 I/O 请求的模式, 以及 I/O 的速度和响应时间.

实例


[bash]
# iostat -x 1
avg-cpu: %user %nice %sys %idle
16.24 0.00 4.31 79.44
rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/cciss/c0d0
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
.......
[/bash]

上面的 iostat 输出表明秒有 28.57 次设备 I/O 操作: delta(io)/s = r/s + w/s = 1.02 + 27.55 = 28.57 (次/秒) 其中写操作占了主体 (w:r = 27:1).

平均每次设备 I/O 操作只需要 0.91 就可以完成, 但每个 I/O 请求却需要等上 78 ms, 为什么? 因为发出的 I/O 请求太多 (每秒钟约 29 个), 假设这些请求是同时发出的, 那么平均等待时间可以这样计算:
平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + ... + 请求总数-1) / 请求总数
应用到上面的例子: 平均等待时间 = 5ms * (1+2+...+28)/29 = 70ms, 和 iostat 给出的 78ms 的平均等待时间很接近. 这反过来表明 I/O 是同时发起的.

每秒发出的 I/O 请求很多 (约 29 个), 平均队列却不长 (只有 2 个 左右), 这表明这 29 个请求的到来并不均匀, 大部分时间 I/O 是空闲的.

一秒中有 14.29% 的时间 I/O 队列中是有请求的, 也就是说, 85.71% 的时间里 I/O 系统无事可做, 所有 29 个 I/O 请求都在142毫秒之内处理掉了.

delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s = 78.21 * delta(io)/s = 78.21*28.57 = 2232.8, 表明每秒内的I/O请求总共需要等待2232.8ms. 所以平均队列长度应为 2232.8ms/1000ms = 2.23, 而 iostat 给出的平均队列长度 (avgqu-sz) 却为 22.35(sysstat >= v4.1.6 已修改该问题 )


准则

  • 如果 %util 接近 100%, 说明产生的I/O请求太多, I/O系统已经满负荷, 该磁盘可能存在瓶颈.

  • svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了), svctm 的大小一般和磁盘性能有关, CPU/内存的负荷也会对其有影响, 请求过多也会间接导致 svctm 的增加. await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式. 如果 svctm 比较接近 await, 说明 I/O 几乎没有等待时间;如果 await 远大于 svctm, 说明 I/O 队列太长, 应用得到的响应时间变慢, 如果响应时间超过了用户可以容许的范围, 这时可以考虑更换更快的磁盘, 调整内核 elevator 算法, 优化应用, 或者升级 CPU.

  • 队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标, 但由于 avgqu-sz 是按照单位时间的平均值, 所以不能反映瞬间的 I/O

2011年3月16日星期三

sysstat

FROM: 系统状态查看工具sysstat

关于 sysstat


sysstat 是一个软件包, 包含监测系统性能及效率的一组工具, 这些工具对于收集系统性能数据, 比如 CPU 使用率, 硬盘和网络吞吐数据, 这些数据的收集和分析, 有利于判断系统是否正常运行和提高系统运行效率.


sysstat 软件包集成如下工具

  • iostat 提供 CPU 使用率及硬盘吞吐效率的数据

  • mpstat 提供单个处理器或多个处理器相关数据

  • sar 负责收集, 报告并存储系统活跃的信息

  • pidstat 提供 Linux 进程的 I/O, CPU , Memory 等相关信息

  • sadc 收集系统 activity data, 是为 sar 所设计的后端

  • sa1 负责收集并存储每天系统动态信息到一个二进制的文件中. 它是通过计划任务工具cron来运行, 是为 sadc 所设计的程序前端程序

  • sa2 负责把每天的系统活跃性息写入总结性的报告中. 它是为 sar 所设计的前端, 要通过cron来调用

  • sadc 是系统动态数据收集工具, 收集的数据被写一个二进制的文件中, 它被用作 sar 工具的后端

  • sadf 显示被sar通过多种格式收集的数据

  • nfsiostat 提供 NFS input/output 的统计数据

  • cifsiostat 提供 CIFS 统计数据



安装 sysstat


对于大多数系统, 都有这个软件包, 软件名以 sysstat 开头.

对于 Debian 或 deb 软件包为基础的系统
[bash]
[root@localhost ~]# apt-get install sysstat
[/bash]

Fedora 系统或以 RPM 包管理的系统
[bash]
[root@localhost ~]# yum install sysstat
[/bash]

如果是RPM包, 可用下面的命令来安装
[bash]
[root@localhost ~]#rpm -ivh sysstat-*.*.*-*.src.rpm
[/bash]


通过源码包编译安装
到官方下载源码包, 目前最新版本是 sysstat-10.0.0, 下载地址

[bash]
[root@localhost ~]# tar zxvf sysstat-10.0.0.tar.gz
[root@localhost ~]$ cd sysstat-10.0.0
[root@localhost sysstat-10.0.0]# ./configure
[root@localhost sysstat-10.0.0]# make
[root@localhost sysstat-10.0.0]# make install
[/bash]
在运行配置脚本时, 可设置各参数.通过 ./configure -help可获得各参数列表及其说明.

NOTE:sysstat <= v7.0.4 不支持配置脚本, 所以在配置 sysstat 时需要用 make config来代替./configure

sysstat 计划任务及其运行


如果想得到 sysstat 工具集所收集的系统信息自动存为某个文件中, 则必须通过cron 为 sa1 和sa2 做计划任务. 我们可以通过修改用户的crontab. 在默认的情况下, sysstat 历史信息将被存放在/var/log/sa文件中.

cron 计划
在root用户, 通过 crontab -e 来添加下面的一段(如果安装时有修改过参数, 请对照执行修改如下)
[bash]
# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/local/lib/sa/sa1 -d 1 1
# 0 * * * * root /usr/local/lib/sa/sa1 -d 600 6 &
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/local/lib/sa/sa2 -A
[/bash]
每天运行得到的信息都会保存到/var/log/sa目录, 运行sar -A 命令可得到类似于该报告的信息.

创建 sysstat 的启动脚本
[bash]
[root@localhost ~]# touch /etc/rc.d/init.d/sysstat
[root@localhost ~]# vim /etc/rc.d/init.d/sysstat
[/bash]
将如下代码加入 /etc/rc.d/init.d/sysstat
[bash]
#!/bin/sh
# Begin $rc_base/init.d/sysstat

# Based on sysklogd script from LFS-3.1 and earlier.
# Rewritten by Gerard Beekmans - gerard@linuxfromscratch.org

. /etc/sysconfig/rc
. $rc_functions

case "$1" in
start)
echo "Calling the system activity data collector (sadc)..."
/usr/lib/sa/sadc -F -L -
evaluate_retval
;;
*)

echo "Usage: $0 start"
exit 1
;;
esac

# End $rc_base/init.d/sysstat
[/bash]
保存后, 执行如下命令
[bash]
[root@localhost ~]# chmod 755 /etc/rc.d/init.d/sysstat
[/bash]

sysstat 启动脚本需要在系统启动时就开始运行. 所以, 需要为其在 /etc/rc.d/rcsysinit.d下创建一符号链接.命令如下:

[bash]
[root@localhost ~]# ln -sf /etc/rc.d/init.d/sysstat /etc/init.d/rc.sysinit/sysstat
[/bash]

有了 sysstat 的守护进程, 这样开机后, sysstat的守护进程, 就时时刻刻的为我们服务了. sa , sa1或sa2自动把信息存在 /var/log/sa 目录的二进制文件中.

当然, 也可以通过手动的方法来打开 sysstat 的守护程序;
[bash]
[root@localhost ~]# /etc/rc.d/init.d/sysstat start
[/bash]
or
[bash]
[root@localhost ~]# /usr/local/lib/sa/sa1
[root@localhost ~]# /usr/local/lib/sa/sa2
[/bash]

NOTE:如果在配置时有加入--enable-install-cron参数, 则上面所创建的 crontab, startup script and link在安装时自动创建.

REFRENCE: sysstat

2011年3月15日星期二

减低 InnoDB 停止时时间

FROM: How to decrease InnoDB shutdown time

MySQL 命令终端, 执行如下命令
[sql]
mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
[/sql]

然后在 SHELL 终端执行如下命令
[bash]
[root@localhost ~]# $ mysqladmin ext -i10 | grep dirty
[/bash]

该命令执行后, 终端会输出如下类似的信息
[bash]
| Innodb_buffer_pool_pages_dirty | 1823 |
| Innodb_buffer_pool_pages_dirty | 1512 |
| Innodb_buffer_pool_pages_dirty | 1311 |
......
[/bash]

直到数字列减小到接近于 0时, (如果服务处于 actvie 状态, 该数字只能接近于 0 , 而不可能等于 0), 执行 MySQL 服务停止命令.

xtrabackup

xtrabackup 是 percona 的一个开源项目, 可以热备份innodb , XtraDB,和MyISAM(锁表)


下载 Linux binary , 这个还可用.


如果不想麻烦, 可直接将解压后的包里的 bin 下这两个文件全部扔到 /usr/bin 目录下.
[text]
[root@localhost bin]# ls -al
total 34108
-rwxr-xr-x 1 root root 85630 Dec 9 23:15 innobackupex-1.5.1
-rwxr-xr-x 1 root root 6316740 Dec 9 23:15 xtrabackup_51
......
[/text]

或者将其目录加入到环境变量 $PATH 中, 假设解压后的包放在 /var/tmp/mysql 目录下
[bash]
[root@localhost bin]PATH="$PATH:/var/tmp/mysql/xtrabackup-1.5/bin"
[root@localhost bin]export $PATH
[/bash]
MySQL bin 同样也需要加入$PATH 中


innobackupex-1.5.1 [--sleep=MS] [--compress[=LEVEL]] [--include=REGEXP] [--user=NAME]
[--password=WORD] [--port=PORT] [--socket=SOCKET] [--no-timestamp]
[--ibbackup=IBBACKUP-BINARY] [--slave-info] [--stream=tar]
[--scpopt=OPTIONS-FOR-SCP]
[--defaults-file=MY.CNF]
[--databases=LIST] [--remote-host=HOSTNAME] [--no-lock] BACKUP-ROOT-DIR


innobackupex-1.5.1 --apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF]
[--export] [--redo-only] [--ibbackup=IBBACKUP-BINARY] BACKUP-DIR


innobackupex-1.5.1 --copy-back [--defaults-file=MY.CNF] BACKUP-DIR


  • --defaults-file=[MY.CNF] 指定 MySQL 的配置文件

  • --apply-log 为恢复做准备

  • --redo-only --apply-log组, 强制备份日志时只 redo ,跳过 rollback. 这在做增量备份时非常必要

  • --copy-back 将数据和日志从备份目录恢复到原始目录

  • --remote-host 在指定该参数的情况下, 备份的文件将通过 SSH 连接创建于指定的主机上

  • --stream=[tar] 备份文件输出格式, tar 时使用 tar4ibd , 该文件可在 XtarBackup binary 文件中获得

  • --tmpdir=DIRECTORY 当有指定--remote-host or --stream时, 事务日志临时存储的目录, 默认采用 MySQL 配置文件中所指定的临时目录tmpdir

  • --use-momory=MB 这个用于 ibbackup 子处理 , 即恢复时可用上 MB 的内存

  • --parallel=NUMBER-OF-THREADS 这个用于 xtrabackup 子处理, 即备份时可并行运行的传输数据的进程

  • --sleep=MS 用于 ibbackup, 指在每 copy 1MB 的数据后sleep 的时间(unit:MS). 可缓和在运行 ibbackup 所导致的磁盘 I/O 问题.

  • --compress=[LEVEL] 用于ibbackup, 至在备份数据时压缩的级别. 0-9

  • include=REGEXP只备份匹配的表的数据

  • --databases=LIST 指定备份的库, 格式如"db_name.[table_name] db_name2[table_name] ....". 没有指定时, MyISAM 和 InnoDB 的表都会备份





备份


[bash]
[root@localhost ~]# innobackupex-1.5.1 [--defaults-file=/etc/my.cnf] [--host=127.0.0.1] [--user=root] [--password=password] [--port=3306]
/tmp/backups/ 2>/tmp/backups/backup.log
[/bash]

2>/tmp/backups/backup.log, 是将备份过程中的输出信息重定向到 backup.log
备份后的文件

  • xtrabackup_binlog_info 存放binlog的信息. (binlog需要另外拷贝备份, 如果需要binlog的话)

  • xtrabackup_checkpoints 存放备份的起始位置和结束位置



恢复


停掉数据库, 然后删除数据库目录下的所有数据库文件.
[bash]
[root@localhost ~]# cd /usr/local/mysql/var/
[root@localhost var]# rm -rf *
[/bash]

开始恢复
[bash]
[root@localhost ~]# innobackupex-1.5.1 --user=root --apply-log /tmp/backups/2011-03-15_11-16-37 #应用日志
[root@localhost ~]# innobackupex-1.5.1 --user=root --copy-back /tmp/backups/2011-03-15_11-16-37
[/bash]

数据恢复后, 修改其属主
[bash]
[root@localhost mysql]# chown -R mysql:mysql var/
[/bash]

启动 MySQL 服务
[bash]
[root@localhost var]# mysqld_safe &
[/bash]


备份时压缩成 .tar


[bash]
[root@localhost ~]# innobackupex-1.5.1 [--defaults-file=/etc/my.cnf] [--host=127.0.0.1] [--user=root] [--password=password] [--port=3306] --stream=tar /tmp/backups/tar > /tmp/backups/tar.tar
[/bash]

解压
[bash]
[root@localhost var]# cd /tmp/backups/tar
[root@localhost tar]# tar ixvf tar.tar #i 必须
[/bash]
剩下的恢复操作同上.

备份时压缩成 .tar.gz


[bash]
[root@localhost ~]# innobackupex-1.5.1 [--defaults-file=/etc/my.cnf] [--host=127.0.0.1] [--user=root] [--password=password] [--port=3306] --stream=tar /tmp/backups/tar | gzip > /tmp/backups/tar.tar.gz
[/bash]

解压
[bash]
[root@localhost var]# cd /tmp/backups/tar
[root@localhost tar]# tar izxvf tar.tar.gz #i 必须
[/bash]
剩下的恢复操作同上.

--slave-info 参数


[bash]
[root@localhost ~]innobackupex-1.5.1 [--defaults-file=/etc/my.cnf] [--host=127.0.0.1] [--user=root] [--password=password] [--port=3306] --slave-info /tmp/backup/
[/bash]
备份从库, 加上 --slave-info 备份目录下会多生成一个 xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:
[text]
CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
[/text]


--databases 参数


这个参数用于指定备份的库或者表, 格式如--databases="dbname.[table_name] dbname2.[table_name2] ..."
没指定该参数时, 所有库都会备份(包括 MyISAM 存储引擎). 另外, 若指定的库是 MyISAM 存储引擎, 同样也会备份.



注意点

  • xtarbackup bin 下文件所处的目录要在 $PATH 中

  • MySQL 配置文件中一定有指定 datadir目录

  • 如果备份时有指定--stream=tar, 则tar4ibd 文件所处目录一定要在 $PATH 中(因为使用的是 tar4ibd 去压缩, 在 XtraBackup 的 binary 包中可获得该文件)

2011年3月13日星期日

df 命令

df [OPTION]... [FILE]...

  • -a 显示文件系统的磁盘使用情况, 包括 0 块(block)的文件系统, eg, /proc

  • -k 以 KB 为单位显示

  • -i 显示 i 节点信息, 而不是磁盘块

  • -t 显示各指定类型的文件系统的磁盘空间使用情况

  • -x 列出不是某一指定类型文件系统的磁盘空间使用情况(与-t相反

  • -T 显示文件系统类型


df 是来自于coreutils 软件包, 系统安装自带, 通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置.

列出各文件系统的磁盘空间使用情况


[bash]
[root@localhost tmp]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda3 8628896 3851748 4331748 48% /
/dev/hda1 505604 16006 463494 4% /boot
tmpfs 517644 0 517644 0% /dev/shm
[/bash]

  • Filesystem 列, 代表文件系统对应的设备文件的路径名(一般是硬盘上的分区)

  • 1K-blocks 列, 分区包含的数据块(1024 B)的数目

  • Used, Available 列, 表示已用和可用的数据块数目, 但这两列之和 != 1K-blocks. 这是因为缺省的每个分区都留了少量空间供系统管理员使用. 即使遇到普通用户空间已满的情况, 管理员仍能登陆和留有解决问题所需的工作空间

  • Use% 列, 表示普通用户使用的百分比, 即使这一数字达到 100%, 分区仍然留有系统管理员使用的空间, 原因如上条所释

  • Mounted on 列, 表示文件系统的挂载点



另外, -a参数, 系统所有的分区, 默认情况下, 不显示 0 块的分区
[bash]
[root@localhost tmp]# df -ah
Filesystem Size Used Avail Use% Mounted on
/dev/hda3 8.3G 3.7G 4.2G 48% /
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
devpts 0 0 0 - /dev/pts
/dev/hda1 494M 16M 453M 4% /boot
tmpfs 506M 0 506M 0% /dev/shm
none 0 0 0 - /proc/sys/fs/binfmt_misc
sunrpc 0 0 0 - /var/lib/nfs/rpc_pipefs
[/bash]

列出各文件系统的 innod 节点使用情况


[bash]
[root@localhost tmp]# df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/hda3 2.2M 134K 2.0M 7% /
/dev/hda1 128K 34 128K 1% /boot
tmpfs 127K 1 127K 1% /dev/shm
[/bash]

列出文件系统的类型


[bash]
[root@localhost tmp]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/hda3 ext3 8.3G 3.7G 4.2G 48% /
/dev/hda1 ext3 494M 16M 453M 4% /boot
tmpfs tmpfs 506M 0 506M 0% /dev/shm
[/bash]


-h -H -k参数


-h, -H, 都是以易读的方式显示目前磁盘空间和使用情况.
[bash]
[root@localhost tmp]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda3 8.3G 3.7G 4.2G 48% /
/dev/hda1 494M 16M 453M 4% /boot
tmpfs 506M 0 506M 0% /dev/shm
[/bash]

-h不同, -H, 它是采用 1000 进行容量转换,而-h采用的是1024
[bash]
[root@localhost tmp]# df -H
Filesystem Size Used Avail Use% Mounted on
/dev/hda3 8.9G 4.0G 4.5G 48% /
/dev/hda1 518M 17M 475M 4% /boot
tmpfs 531M 0 531M 0% /dev/shm
[/bash]

[bash]
[root@localhost tmp]# df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda3 8628896 3851728 4331768 48% /
/dev/hda1 505604 16006 463494 4% /boot
tmpfs 517644 0 517644 0% /dev/shm
[/bash]
-k, 以 KB 为单位显示磁盘的使用情况

-l, 过滤 nfs 驱动器


[bash]
[root@localhost tmp]# df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/hda3 8.3G 3.7G 4.2G 48% /
/dev/hda1 494M 16M 453M 4% /boot
tmpfs 506M 0 506M 0% /dev/shm
[/bash]
如果服务器 nfs 了远程服务器的磁盘, 加-l显示的是过滤 nfs 驱动后的结果

2011年3月12日星期六

vmstat 命令

vmstat [-a] [-n] [delay [ count]]
vmstat [-f] [-s] [-m]
vmstat [-S unit]
vmstat [-d]
vmstat [-p disk partition]
vmstat [-V]
vmstat, Virtual Meomory Statistics(虚拟内存统计), 可对操作系统的虚拟内存、进程、CPU活动进行监视. 它是对系统的整体情况进行统计, 但不能针对某个进程进行深入分析.


  • -a 开启 or 关闭显示 active/inactive 内存

  • -n 开启 or 关闭周期性循环输出时, 输出的头部信息仅显示一次

  • delay 两次输出之间的延迟时间

  • count 按照这个指定的时间间隔统计的次数

  • -f 开启 or 关闭显示自系统启动后 forks 的数目, 包括(fork, vfork and clone system calls)

  • -m 显示 slabinfo

  • -s 开启 or 关闭以表格形式显示的 event counters and memory statistics

  • -d 显示 disk statistics

  • -p 显示参数所指定的分区的详细信息

  • -S (k|K|m|M) 以k|kB|m|MB为单位显示,对应转换(1000|1024|1000000|1048576)

  • -V 打印版本信息



[bash]
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 284 66240 165924 419584 0 0 0 5 2 1 0 0 100 0 0

#To output active/inactive memory info
[root@localhost ~]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free inact active si so bi bo in cs us sy id wa st
0 0 284 65620 86928 833976 0 0 0 5 3 1 0 0 100 0 0

#To run vmstat with 2 updates, five seconds apart
[root@localhost ~]# vmstat 5 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 284 65620 165924 419824 0 0 0 5 3 1 0 0 100 0 0
0 0 284 65620 165924 419828 0 0 0 7 1014 64 0 0 100 0 0
[/bash]


procs, 下面三种状态的进程数

  • r 等待运行的进程数

  • b 在等待的进程数(通常在等待 IO)

  • w 可进入运行队列但被替换的进程(Solaris vmstat)



memory, 虚拟内存和实存信息

  • swpd 虚拟内存使用情况, unit:kb

  • free 空闲的内存, unit:kb

  • buff 被用来做 buffer 的内存数, unit:kb

  • cache 被用来做 cache 的内存数, unit:kb

  • inactive 闲置的内存,unit:kb, -a显示

  • active 活动内存, unit:kb,-a显示



swap, 显示磁盘与内存每秒的交换

  • si 从磁盘交换到内存的交换页数量, unit:kb

  • so 从内存交换到磁盘的交换页数量, unit:kb



io, 显示块设备每秒发送和收到的块数

  • bi 发送到块设备的块数, unit: blocks

  • bo 从块设备接收到的数据, unit:blocks



system

  • in 每秒的中断数, 包括时钟中断

  • cs 每秒的环境切换次数



CPU, CPU 故障时间的百分比, 在多处理器系统上, 这是全部处理器的平均值

  • us CPU 使用时间(except kernel)

  • sy CPU 系统使用时间(内核)

  • id 闲置时间

  • wa 等待 IO 的时间

  • st



disk, 显示每秒的磁盘操作, s 表示 scsi 盘, 0 表示盘号

pages, 每秒页面调度活动数量的信息(Solaris vmstat)

  • re 回收的页面

  • mf 非常严重错误的页面

  • pi 进入页面数, unit:KB

  • po 出页面数, unit:KB

  • fr 空也的页面数, unit:KB

  • de 提前读入的页面中的未命中数

  • sr 通过时钟算法扫描的页面



fault, 显示每秒的中断数(Solaris vmstat)

  • in 设备中断

  • sy 系统中断

  • cy cpu交换



准测

  • r<5, b≈0

  • 如果free < MINFREE, 将会出现连续不断的页面调度, 将导致系统性能问题.

  • 如果在多用户环境中us+sys>80, 进程就会在运行队列中花费等待时间, 响应时间和吞吐量就会下降.

  • wa > 40, 表明磁盘io没有也许存在不合理的平衡, 或者对磁盘操作比较频繁

  • 如果 r 经常大于 4 , 且 id 经常少于 40, 表示 CPU 的负荷很重

  • 如果 pi, po 长期不等于 0, 表示内存不足

  • 如果 disk 经常不等于 0, 且在 b 中的队列大于 3, 表示 io 性能不好





通过 vmstat 识别 CPU 瓶颈


r(运行队列)展示了正在执行和等待 CPU 资源的任务个数. 当这个值超过了 CPU 数目, 就会出现CPU瓶颈

获得 CPU 个数的命令(Linux):
[bash]
[root@localhost ~]# cat /proc/cpuinfo | grep processor | wc -l
[/bash]

当 r 值超过了CPU个数, 就会出现CPU 瓶颈, 解决办法大体如下

  • 最简单的就是 增加 CPU个数

  • 通过调整任务执行时间, 如大任务放到系统不繁忙的情况下进行执行, 进尔平衡系统任务

  • 调整已有任务的优先级



通过 vmstat 识别 CPU 满负荷


vmstat 中 CPU 的度量是百分比. 当us+sy≈100时, 表示 CPU 正在接近满负荷工作. 但要注意的是, CPU 满负荷工作并不能说明什么, *nix 总是试图要 CPU 尽可能的繁忙, 使得任务的吞吐量最大化. 唯一能够确定 CPU 瓶颈的还是 r(运行队列) 的值.

通过 vmstat 识别 RAM 瓶颈


数据库服务器都只有有限的 RAM, 出现内存争用现象是常见问题

首先察看 RAM 的数量, 命令如下
[bash]
[root@localhost ~]# free
total used free shared buffers cached
Mem: 1035292 969548 65744 0 165924 419720
-/+ buffers/cache: 383904 651388
Swap: 2096472 284 2096188
[/bash]

也可使用 top 等其他命令来显示RAM.
当内存的需求大于RAM的数量, 服务器启动虚拟内存机制, 通过虚拟内存, 可以将 RAM 段移到 SWAP DISK 的特殊磁盘段上, 这样会出现虚拟内存的页导出和页导入现象, 页导出并不能说明 RAM 瓶颈, 虚拟内存系统经常会对内存段进行页导出, 但页导入操作就表明了服务器需要更多的内存了, 页导入需要从 SWAP DISK 上将内存段复制回 RAM, 导致服务器速度变慢.

解决办法有如下几种

  • 加大 RAM

  • 改小 SGA, 使得对 RAM 需求减少

  • 减少 RAM 的需求(减少 PGA etc)



Reference:

查看 CPU, Memory, I/O and NetFlow

iostat 查看磁盘 I/O


[bash]
[root@localhost ~]# iostat -d -x 2
extended device statistics
device mgr/s mgw/s r/s w/s kr/s kw/s size queue wait svc_t %b
hda 0 0 0.0 0.9 0.1 5.4 6.3 0.0 4.7 0.9 0
extended device statistics
device mgr/s mgw/s r/s w/s kr/s kw/s size queue wait svc_t %b
hda 0 3 0.0 2.0 0.0 20.0 10.0 0.0 0.8 0.5 0
......
[/bash]
命令释意: 查看磁盘 I/0 情况,且每两秒刷新一次

[bash title="vmstat 查看 CPU 使用情况"]
[root@localhost ~]# vmstat 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 284 68700 165876 416748 0 0 0 5 1 1 0 0 100 0 0
......
[/bash]
命令释意: 查看CPU使用情况的命令, 每 5 秒刷新一次,最右侧列为 CPU 的占用率的数据


top 查看进程占有率


[bash]
[root@localhost ~]# top
[/bash]
然后在 top 的命令内部命令栏输入shift+p or P
[bash]
top - 13:38:52 up 102 days, 4:17, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 81 total, 2 running, 79 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1035292k total, 966592k used, 68700k free, 165876k buffers
Swap: 2096472k total, 284k used, 2096188k free, 416760k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4875 root 15 0 2192 1000 800 R 0.3 0.1 0:00.15 top
1 root 15 0 2060 620 532 S 0.0 0.1 0:01.65 init
2 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
.......
[/bash]
命令释意: 查看进程处理器占用率情况,并对其进行排序

free 查看内存使用情况


[bash]
[root@localhost ~]# free
total used free shared buffers cached
Mem: 1035292 966592 68700 0 165876 416768
-/+ buffers/cache: 383948 651344
Swap: 2096472 284 2096188
[/bash]
命令释意: 查看内存使用情况

top 查看进程内存使用


[bash]
[root@localhost ~]# top
[/bash]
然后在 top 的命令内部命令栏输入shift+m or M
[bash]
top - 13:48:52 up 102 days, 4:27, 1 user, load average: 0.00, 0.01, 0.00
Tasks: 81 total, 2 running, 79 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1035292k total, 966592k used, 68700k free, 165876k buffers
Swap: 2096472k total, 284k used, 2096188k free, 416784k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4128 root 34 19 280m 266m 2112 S 0.0 26.4 1:48.40 yum-updatesd
8314 www 18 0 171m 34m 34m S 0.0 3.4 0:06.03 memcacheq
8280 www 15 0 88084 34m 588 S 0.0 3.4 0:01.23 memcached
10907 mysql 15 0 122m 16m 3892 S 0.0 1.7 0:25.29 mysqld
......
[/bash]
命令释意: 查看进程内存占用率情况,并对其进行排序



获得针对某个 Interface 的网络流量


[bash]
[root@localhost ~]# date;ifconfig eth0
Sun Mar 13 13:51:29 CST 2011
eth0 Link encap:Ethernet HWaddr 00:50:56:A4:0D:89
inet addr:172.10.7.215 Bcast:172.10.7.255 Mask:255.255.248.0
inet6 addr: fe80::250:56ff:fea4:d89/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:72113071 errors:12213 dropped:30790 overruns:0 frame:0
TX packets:1062902 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3311165612 (3.0 GiB) TX bytes:101244262 (96.5 MiB)
Interrupt:59 Base address:0x2000


[root@localhost ~]# date;ifconfig eth0
Sun Mar 13 13:53:13 CST 2011
eth0 Link encap:Ethernet HWaddr 00:50:56:A4:0D:89
inet addr:172.10.7.215 Bcast:172.10.7.255 Mask:255.255.248.0
inet6 addr: fe80::250:56ff:fea4:d89/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:72113528 errors:12213 dropped:30790 overruns:0 frame:0
TX packets:1062968 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3311204659 (3.0 GiB) TX bytes:101285190 (96.5 MiB)
Interrupt:59 Base address:0x2000

[/bash]
命令释意: 通过比较两个时间网络接口的 RXTX 数据来获得针对某个 Interface 的网络流量

free 命令

free [-b | -k | -m] [-o] [-s 间隔秒数 ] [-t] [-V]
free, Linux 内存查看命令, 它不仅会显示内存的使用情况, 还包括实际物理内存, 虚拟的交换文件内存, 共享内存区段, 以及系统核心使用的缓冲区等.

  • -b 以 Byte 为单位显示内存使用情况

  • -k 以 KB 为单位显示内存使用情况

  • -m 以 MB 为单位显示内存使用情况

  • -o 不显示缓冲区调节剂

  • -s 间隔秒数持续观察内存使用状况

  • -t 显示内存总和列

  • -V 显示版本信息



[bash]
[root@localhost ~]# free
[/bash]

[bash title="free"]
total used free shared buffers cached
Mem: 1035292 965476 69816 0 165876 415680
-/+ buffers/cache: 383920 651372
Swap: 2096472 284 2096188
[/bash]

各值释意如下:





































  total used free shared buffers cached
Mem 物理内存 1035292 物理内存总量 965476 总计分配给缓存(buffer, chahe)使用的数量,但其中可能部分缓存并未实际使用 69816 未被分配的内存 0 共享内存 165876 系统分配但未被使用的 buffer 数量 415680 系统分配但未被使用的 cache 数量
-/+ buffers/cached 物理内存的缓存统计   383920 实际使用的 buffer 和 cache 数量, 即实际使用的内存总量 651372 未被使用的 buffer, cache和未被分配的内存之和, 即当前系统实际可用内存      
Swap 硬盘上交换分区的使用情况 2096472 284 2096188      


从上可得如下等式:

  • Mem|total = Mem|used + Mem|free

  • Mem|total = -/+ buffers/cached|used + -/+ buffers/cached|free

  • Mem|used = Mem|buffers + Mem|cached + -/+ buffers/cached|used

  • -/+ buffers/cached|free = Mem|free + Mem|buffers + Mem|cached




Mem 的 used/free与 -/+ buffers/cache used/free

  • Mem 行是从 OS 的角度来看, 因为对于 OS, buffers/cached 都是属于被使用, 所以他的可用内存是 69816KB, 已用内存是 965476KB, 包括OS 系统内核使用 + Application(X, Nginx etc)使用 + buffers + cached, 即 Mem|used = Mem|buffers + Mem|cached + -/+ buffers/cached|used

  • -/+ buffers/cache 行是从应用程序角度来看, 对于应用程序来说, buffers, cached 是等于可用, 因为 buffers/cached 是为了提高文件读取的性能, 当应用程序需在用到内存的时候, buffers/cached 会很快地被回收. 所以从应用程序的角度来说, -/+ buffers/cached|free = Mem|free + Mem|buffers + Mem|cached





buffer 与 cache 的区别

  • cache, 高速缓存, 位于 CPU 与 主内存间的一种容量较小但速度很高的存储器. 由于 CPU 的速度高于主内存, CPU 直接从内存中存取数据要等待一定时间周期, Cache 中保存着 CPU 干用过后循环使用的一部分数据, 当 CPU 再次使用该部分数据时可从 Cache 中直接调用, 这样可减少 CPU 的等待时间, 提高系统的效率. Cache 分为一级 Cache(L1 Cache)和二级 Cache(L2 Cache), L1 Cache集中在 CPU 内部, L2 Cache 早期一般焊在主板上, 现在也集中在 CPU 内部.

  • buffer, 缓冲区, 一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域. 通过缓冲区, 可使进程之间的相互等待变少, 从而使速度慢的设备读入数据时, 速度快的设备的操作进程不发生间断.

  • Free 中的 buffer and cache(它们都是占用内存), buffers, 做为 buffer cache 的内存, 是块设备的读写缓冲区;cached, 做为 page cache 的内存, 是文件系统的 cache.

  • 如果 cache 值很大, 说明 cache 住的文件和数据很多. 频繁访问到的文件都能被 cache 住, 如此, 磁盘的读 IO 必会非常小.这样也就提高了系统性能, 当需要这些内存时, 系统也会自动释放(Windows 除外)




在 Linux 的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(Mem|free >0),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。
因此查看目前进程正在实际被使用的内存,是Mem|used = Mem|buffers + Mem|cached + -/+ buffers/cached|used,也可认为如果 Swap 没有大量使用,Mem 还是够用,只有 Mem 被当前进程实际占用完(Mem|buffers=0 and Mem|cached=0), 才使用到 Swap.


另外, 为了提高磁盘存取效率, Linux 还做了一些精心的设计, 除了对 dentry 进行缓存(用于 VFS, 加速文件路径名到 inode 的转换), 还采取了两种主要 Cache 方式:Buffer Cache 和 Page Cache, 前者针对磁盘块的读写, 后者针对文件 inode 的读写. 这些 Cache 有效缩短了 I/O 系统调用(read, write, getdents etc)的时间.

如果感兴趣可以进一步参考文件 /proc/meminfo, free命令就是根据它的信息生成的. free命令的源码可从procps-xxx-.src.rpm获取, xxx为版本号, 比如procps-3.2.3-5.3.src.rpm.

内核参考代码
arch/i386/mm/init.c
fs/proc/proc_misc.c
include/linux/swap.h
mm/filemap.c
fs/buffer.c

另外还可参考O'REILLY的书《Understanding the LINUX KERNEL》.

2011年3月11日星期五

top 命令

top 显示系统当前的进程和其他状况,它是一个动态显示过程, 即可通过用户按键来不断刷新当前状态, 如果在前台执行该命令, 它将独占前台, 直到用户终止该程序.
top [-] [d] [p] [q] [C] [S] [s] [n]
参数说明:

  • -d 指定每两次屏幕信息刷新之间的时间间隔, 当前用户可用s交互命令来改变之

  • -p 通过指定监控进程 ID 来仅仅监控某个进程的状态

  • -q 该选项将使 top 没有任何延迟的进行刷新, 如果调用程序有超级用户权限, 那么 top 将以尽可能高的优先级运行

  • -C 显示整个命令行而不只是命令

  • -S 指定累计模式

  • -s 使 top 命令在安全模式中运行, 这将去除交互命令所带来的潜在危险

  • -n 使 top 不显示任何闲置或僵尸进程



[bash]
[root@localhost ~]# top
[/bash]

结果如下:
[bash]
top - 16:25:34 up 15 days, 23:29, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 107 total, 2 running, 104 sleeping, 1 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.3%hi, 0.0%si, 0.0%st
Mem: 1035292k total, 915272k used, 120020k free, 166948k buffers
Swap: 2096472k total, 0k used, 2096472k free, 403444k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24083 root 15 0 2192 1020 800 R 0.7 0.1 0:00.75 top
1 root 15 0 2060 624 532 S 0.0 0.1 0:01.44 init
2 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
5 root 10 -5 0 0 0 S 0.0 0.0 0:00.70 events/0
.......
[/bash]

命令行输入top后,界面以全屏的方式显示信息,其结果包括三个部分,系统信息栏,命令输入栏, 进程列表栏(如上)

系统信息栏


第一行(top), 同 uptime 命令的执行结果

  • 16:25:34 current system time

  • 15 days, 23:29 系统自启动后到当前的运行时间

  • 2 users 登录到系统的用户的终端数

  • load average 当前系统的负载平均值,之后的 0.00, 0.00, 0.00 分别为 1 min, 5 min, 15 min前进程的平均数,一般认为这个数超过CPU数目时,CPU 的负载将会过重


第二行(Tasks)

  • 107 total 为当前系统的进程数

  • 2 running 为当前运行中的进程数

  • 104 sleeping 为睡眠中的进程数

  • 1 stopped 被停止的系统进程数

  • 0 zombie 被复原的进程数


第三行(Cpus)

  • 0.0%us 用户空间占用 CPU 百分比

  • 0.0%sy 内核空间占用 CPU 百分比

  • 0.0%ni 用户进程空间内改变过优先级的进程占用 CPU 百分比

  • 99.7%id 空闲 CPU 百分比

  • 0.0%wa 等待输入输出的 CPU 时间百分比

  • 0.3%hi 硬件中断请求

  • 0.0%st 软件中断请求


当有多个 CPU 时,该内容可能会有多行
第四行(Mem)

  • 1035292k total 物理内存总量

  • 915272k used 使用的物理内存总量

  • 120020k free 空闲内存总量

  • 166948k buffers 用作内核缓存的内存总量


第五行(Swap)
表示类别同第四行(Mem),但此处反映着交换分区 (Swap) 的使用情况。通常,交换分区被频繁使用被视为物理内存不足而造成的。
内存中的内容被换出到交换区,而后又被换入到内存,但是用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。

中间部分的内部命令提示栏


top 运行中可以通过 top 的内部命令对进程的显示方式进行控制。内部命令如下表:

  • s 改变两次刷新之间的延迟时间. 系统将提示用户输入新的时间, unit:s. 如果有小数,则会换成 ms, 输入 0 值则系统将不断刷新, 默认值是 5. 如果设置的值太小, 则会引起屏幕不断刷新, 且同时系统负载也会大大增加

  • l 关闭或开启第一部分平均负载和启动时间的信息

  • t 关闭或开启第一部分进程和 CPU 的信息

  • m 关闭或开启第一部分内存和 Swap 的信息

  • N 以 PID 的大小的顺序排列表示进程列表

  • P 以 CPU 占用率大小的顺序排列进程列表

  • M 以内存占用率大小的顺序排列进程列表

  • h or ? 显示帮助

  • n 设置在进程列表所显示进程的数量

  • q 退出 top

  • CTRL+L 重写屏幕

  • k 终止一个进程, 系统将提示用户输入需要终止的进程 PID, 以及需要发送给进程什么样的信号, 一般的终止进程使用 15 信号, 如果不能正常结束那就使用信号 9 强制结束该进程. 默认值是信号 15, 在安全模式中刺命令被屏蔽

  • i 忽略闲置和僵死的进程

  • r 重新安排一个进程的优先级. 系统提示用户输入需要改变的进程 PID 以及需要设自豪的优先级值. 输入一个正值将使优先级降低, 反之则可使该进程拥有更高的优先级. 默认值是 10

  • S 切换到累计模式

  • f or F 从当前显示中添加或删除项目

  • o or O 改变显示项目的顺序

  • c 切换显示命令名称和完整命令行

  • T 根据时间/累计时间进行排序

  • W 将当前设置写入~/.toprc文件中, 写 top 配置文件的推荐方法


另外,按top后, 再Z+X可飘红显示。

进程列表栏


各列的含义

















































































序号列名含义
aPID进程ID
bPPID父进程ID
cRUSERReal user name
dUID进程所有者的用ID
eUSER进程所有者的用户名
fGROUP进程所有者的组名
gTTY启动进程的终端名,不是从终端启动的进程则显示为 ?
hPR优先级
iNInice 值,负值表示高优先级
jP最后使用的 CPU, 仅在多 CPU 环境下有意义
k%CPU上次更新到目前的 CPU 时间占用百分比
lTIME进程使用的 CPU 时间总计, unit: s
mTIME+进程使用的 CPU 时间总计, unit: 1/100 s
n%MEM进程使用的物理内存百分比
oVIRT进程使用的虚拟内存总量, unit: kb VIRT=SWAP+RES
pSWAP进程使用的虚拟内存中,被换出的大小,unit:kb
qRES进程使用的,未被换出的物理内存大小, unit:kb RES=CODE+DATA
rCODE可执行代码占的物理内存大小, unit:kb
sDATA可执行代码以外的部分(数据段+栈)占用的物理内存大小.unit:kb
tSHR共享内存大小, unit:kb
unFLT页面错误次数
vnDRT最后一次写入到现在, 被修改过的页面数
wS进程状态 D(不可中断的睡眠状态) R(运行) T(跟踪/停止) Z(僵尸进程) S(睡眠)
xCOMMAND命令名/命令行/td>
yWCHAN若该进程在睡眠, 则显示睡眠中的系统函数名
zFlags任务标志

默认情况下仅显示 PID, USER, PR, NI, VIRT, RES, SHR, S, %CPU, %MEM, TIME+, COMMAND 列. 可通过快捷键来更改显示的内容
f键之后会显示列的列表, 再按a-z即可显示/隐藏对应的列, 最后按Enter键确定。
o后改变列显示的顺序, 再按a-z可将相对应的列向右移动,而按A-Z可将相对应的列向左移动, 最后按Enter键确定。
F or O键, 再按a-z可将进程按照相对应的列进行排序, 而R键可将当前的排序倒转。