免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: compare2000
打印 上一主题 下一主题

linux git常见命令整理 [复制链接]

论坛徽章:
3
天秤座
日期:2013-12-27 13:44:58射手座
日期:2014-05-22 16:52:43天蝎座
日期:2014-08-13 16:03:21
41 [报告]
发表于 2014-05-24 00:10 |只看该作者
linux目录架构
/       根目录
/bin         常用的命令   binary   file   的目錄
/boot       存放系统启动时必须读取的档案,包括核心   (kernel)   在内
          /boot/grub/menu.lst       GRUB设置
          /boot/vmlinuz       内核
          /boot/initrd           核心解壓縮所需   RAM   Disk
/dev         系统周边设备           
/etc         系统相关设定文件
          /etc/DIR_COLORS       设定颜色
          /etc/HOSTNAME       设定用户的节点名
          /etc/NETWORKING       只有YES标明网络存在
          /etc/host.conf   文件说明用户的系统如何查询节点名
          /etc/hosts   设定用户自已的IP与名字的对应表
          /etc/hosts.allow   设置允许使用inetd的机器使用   
          /etc/hosts.deny   设置不允许使用inetd的机器使用
          /etc/hosts.equiv   设置远端机不用密码
          /etc/inetd.conf   设定系统网络守护进程inetd的配置
          /etc/gateways   设定路由器
          /etc/protocols   设定系统支持的协议
          /etc/named.boot   设定本机为名字服务器的配置文件
          /etc/sysconfig/network-scripts/ifcfg-eth0       设置IP
          /etc/resolv.conf         设置DNS     
          /etc/X11     X   Window的配置文件,xorg.conf   或   XF86Config   這兩個   X   Server   的設定檔
          /etc/fstab         记录开机要mount的文件系统
          /etc/inittab   设定系统启动时init进程将把系统设置成什么样的runlevel
          /etc/issue   记录用户登录前显示的信息
          /etc/group   设定用户的组名与相关信息
          /etc/passwd   帐号信息
          /etc/shadow   密码信息
          /etc/sudoers   可以sudo命令的配置文件
          /etc/securetty   设定哪些终端可以让root登录
          /etc/login.defs   所有用户登录时的缺省配置
          /etc/exports   设定NFS系统用的
          /etc/init.d/       所有服務的預設啟動   script   都是放在這裡的,例如要啟動或者關閉
          /etc/xinetd.d/     這就是所謂的   super   daemon   管理的各項服務的設定檔目錄
          /etc/modprobe.conf       内核模块额外参数设定
          /etc/syslog.conf       日志设置文件
/home       使用者家目录
/lib         系统会使用到的函数库
          /lib/modules       kernel   的相关模块
          /var/lib/rpm       rpm套件安装处   
/lost+found         系統不正常產生錯誤時,會將一些遺失的片段放置於此目錄下
/mnt           外设的挂载点
/media       与/mnt类似
/opt           主机额外安装的软件
/proc         虚拟目录,是内存的映射
            /proc/version       内核版本
              /proc/sys/kernel       系统内核功能
/root         系统管理员的家目录
/sbin         系统管理员才能执行的指令
/srv           一些服務啟動之後,這些服務所需要取用的資料目錄
/tmp           一般使用者或者是正在執行的程序暫時放置檔案的地方
/usr           最大的目录,存许应用程序和文件
        /usr/X11R6:       X-Window目录   
        /usr/src:         Linux源代码
        /usr/include:系统头文件
        /usr/openwin   存放SUN的OpenWin   
        /usr/man   在线使用手册
        /usr/bin                       使用者可執行的   binary   file   的目錄
        /usr/local/bin           使用者可執行的   binary   file   的目錄
        /usr/lib                       系统会使用到的函数库
        /usr/local/lib           系统会使用到的函数库
        /usr/sbin                     系统管理员才能执行的指令
        /usr/local/sbin         系统管理员才能执行的指令
/var       日志文件
        /var/log/secure         記錄登入系統存取資料的檔案,例如   pop3,   ssh,   telnet,   ftp   等都會記錄在此檔案中
        /var/log/wtmp             記錄登入者的訊息資料,   last
        /var/log/messages     幾乎系統發生的錯誤訊息
        /var/log/boot.log     記錄開機或者是一些服務啟動的時候,所顯示的啟動或關閉訊息
        /var/log/maillog       紀錄郵件存取或往來(   sendmail   與   pop3   )的使用者記錄
        /var/log/cron             記錄   crontab   這個例行**的內容
        /var/log/httpd,   /var/log/news,   /var/log/mysqld.log,   /var/log/samba,   /var/log/procmail.log:
        分別是幾個不同的網路服務的記錄檔


一些常用的基本命令:
uname   -a         查看内核版本               
ls   -al         显示所有文件的属性
pwd                   显示当前路径                 
cd   -         返回上一次目录           cd   ~         返回主目录
date   s             设置时间、日期                     
cal             显示日历           cal   2006
bc                     计算器具                              
man     &   info           帮助手册
locale           显示当前字体           locale   -a         所有可用字体           /etc/sysconfig/i18n设置文件
LANG=en         使用英文字体                        
sync               将数据同步写入硬盘                 
shutdonw   -h   now   &   half   &   poweroff     关机
reboot           重启                                       
startx     &     init   5       进入图形介面
/work     &   ?work         向上、下查找文档内容
chgrp             改变档案群组     chgrp   testing   install.log         
chown           改变所属人       chown   root:root   install.log
chmod             改变属性           chmod   777   install.log           read=4     write=2     execute=1
cp       复制       cp   filename
rm       删除文件     rm   -rf   filename       强制删除文件
rmdir       删除文件夹
mv     移动         mv   123.txt   222.txt     重命名
mkdir           创建文件夹
touch           创建文件     更新当前时间
cat               由第一行开始显示           cat   |more     分页
nl                 在内容前加行号
more     &     less       一面一面翻动
head   -n   filename       显示第N行内容
tail   -n   filename     显示后N行内容
od                 显示非纯文档
df   -h   显示分区空间
du     显示目录或文件的大小
fdisk       分区设置         fdisk   -l   /dev/hda     显示硬盘分区状态
mkfs         建立各种文件系统     mkfs   -t   ext3     /dev/ram15      
fsck         检查和修复LINUX档案
ln             硬链接       ln   -s     软件链接
whereis       查找命令
locate         查找
find             查找       find   /   -name   "***.*** "
which           查看工具
whoami         显示当前用户
gcc   -v         查看GCC版本
chattr   +i   filename     禁止删除       chattr   -i   filename     取消禁止
lsattr         显示隐藏档属性
updatedb     更新资料库
mke2fs         格式化       mkfs   -t   ext3   
dd   if=/etc/passwd   of=/tmp/passwd.bak         备份
mount           列出系统所有的分区
mount   -t   iso9660   /dev/cdrom   /mnt/cdrom       挂载光盘
mount   -t   vfat   /dev/fd0   /mnt/floppy               挂载软盘
mount   -t   vfat   -o   iocharset=utf8,umask=000   /dev/hda2   /mnt/hda2       挂载fat32分区
mount   -t   ntfs   -o   nls=utf8,umask=000   /dev/hda3   /mnt/hda3                   挂载ntfs分区
Linux-NTFS   Project:   http://linux-ntfs.sourceforge.net/
umount   /mnt/hda3     缷载
ifconfig       显示或设置网络设备
service   network   restart       重启网卡     
ifdown   eth0     关闭网卡
ifup   eth0         开启网卡
clear         清屏
history         历史记录               !55     执行第55个指令
stty       设置终端         stty   -a
fdisk   /mbr       删除GRUB
at           僅進行一次的工作排程
crontab       循環執行的例行性命令         [e]编辑,[l]显示,[r]删除任务
&               后台运行程序         tar   -zxvf   123.tar.gz   &   ---------> 后台运行
jobs         观看后台暂停的程序       jobs   -l
fg             将后台程序调到前台       fg   n   ------> n是数字,可以指定进行那个程序
bg             让工作在后台运行
kill         结束进程         kill   -9   PID           [9]强制结束,[15]正常结束,[l]列出可用的kill信号
ps   aux     查看后台程序      
top           查看后台程序       top   -d   2         每两秒更新一次                 top   -d   2   -p10604       观看某个PID
                top   -b   -n   2   >   /tmp/top.txt   -----> 將   top   的資訊進行   2   次,然後將結果輸出到   /tmp/top.txt         
pstree       以树状图显示程序         [A]以   ASCII   來連接,   列出PID,   [p]列出帐号
killall       要刪除某個服務         killall   -9   httpd
free             显示内存状态           free   -m     --------> 以M为单位显示
uptime         显示目前系统开机时间
netstat       显示网络状态         netstat   -tulnp------> 找出目前系統上已在監聽的網路連線及其   PID
dmesg           显示开机信息         demsg   |   more
nice             设置优先权             nice   -n   -5   vi   &   -----> 用   root   給一個   nice   植為   -5   ,用於執行   vi   
renice         调整已存在优先权
runlevel     显示目前的runlevel
depmod         分析可载入模块的相依性
lsmod           显示已载入系统的模块
modinfo       显示kernel模块的信息
insmod         载入模块
modprobe       自动处理可载入模块
rmmod           删除模块
chkconfig       检查,设置系统的各种服务           chkconfig   --list   -----> 列出各项服务状态
ntsysv           设置系统的各种服务
cpio             备份文件

压缩命令:
  *.Z             compress   程式壓縮的檔案;   
  *.bz2         bzip2   程式壓縮的檔案;   
  *.gz           gzip   程式壓縮的檔案;   
打包:*.tar         tar   程式打包的資料,並沒有壓縮過;   
  *.tar.gz   tar   程式打包的檔案,其中並且經過   gzip   的壓縮
compress   filename     压缩文件     加[-d]解压     uncompress
gzip   filename       压缩     加[-d]解压     zcat   123.gz   查看压缩文件内容
bzip2   -z   filename     压缩     加[-d]解压       bzcat   filename.bz2     查看压缩文件内容

tar   -cvf   /home/123.tar   /etc     打包,不压缩
tar   -zcvf  /home/123.tar.gz   /etc     打包,不压缩
tar   -xvf   123.tar       解开包
tar   -zxvf   /home/123.tar.gz     以gzip解压
tar   -jxvf   /home/123.tar.bz2     以bzip2解压
tar   -ztvf   /tmp/etc.tar.gz       查看tar内容
cpio   -covB     >   [file|device]       份份
cpio   -icduv   <   [file|device]       还原

vi一般用法
一般模式                             编辑模式                                     指令模式
h   左                               a,i,r,o,A,I,R,O                           :w   保存
j   下                                 进入编辑模式                                 :w!   强制保存
k   上                                 dd   删除光标当前行                       :q!   不保存离开
l   右                                 ndd   删除n行                                   :wq!   保存后离开
0   移动到行首                 yy   复制当前行                                 :e!   还原原始档
$   移动到行尾                 nyy   复制n行                                     :w   filename   另存为
H   屏幕最上                     p,P   粘贴                                           :set   nu   设置行号
M   屏幕中央                     u     撤消                                             :set   nonu   取消行号
L   屏幕最下                     [Ctrl]+r   重做上一个动作               ZZ   保存离开
G   档案最后一行             [ctrl]+z   暂停退出                         :set   nohlsearch       永久地关闭高亮显示
/work   向下搜索                                                                       :sp   同时打开两个文档   
?work   向上搜索                                                                       [Ctrl]+w   两个文档设换
gg   移动到档案第一行                                                             :nohlsearch         暂时关闭高亮显示


认识SHELL
alias         显示当前所有的命令别名             alias   lm= "ls   -al "       命令别名         unalias   lm   取消命令别名
type             类似which
exprot         设置或显示环境变量
exprot   PATH= "$PATH ":/sbin     添加/sbin入PATH路径
echo   $PATH         显示PATH路径
bash             进入子程序
name=yang           设定变量
unset   name         取消变量
echo   $name         显示变量的内容
myname= "$name   its   me "       &       myname= '$name   its   me '           单引号时$name失去变量内容
ciw=/etc/sysconfig/network-scripts/           设置路径
env             列出所有环境变量
echo   $RANDOM         显示随意产生的数
set             设置SHELL
PS1= '[\u@\h   \w   \A   #\#]\$   '           提示字元的設定
      [root@linux   ~]#   read   [-pt]   variable           -----------读取键盘输入的变量
      參數:
      -p     :後面可以接提示字元!
      -t     :後面可以接等待的『秒數!』
declare         声明   shell   变量
ulimit   -a       显示所有限制资料
  ls   /tmp/yang   &&   echo   "exist "   ||   echo   "not   exist "
  意思是說,當   ls   /tmp/yang   執行後,若正確,就執行echo   "exist "   ,若有問題,就執行echo   "not   exist "   
  echo   $PATH   |   cut   -d   ': '   -f   5               以:为分隔符,读取第5段内容
  export   |   cut   -c   10-20             读取第10到20个字节的内容
  last   |   grep   'root '         搜索有root的一行,加[-v]反向搜索
  cat   /etc/passwd   |   sort         排序显示
  cat   /etc/passwd   |   wc             显示『行、字数、字节数』
正规表示法
[root@test   root]#   grep   [-acinv]   '搜尋字串 '   filename
              參數說明:
              -a   :將   binary   檔案以   text   檔案的方式搜尋資料
              -c   :計算找到   '搜尋字串 '   的次數
              -i   :忽略大小寫的不同,所以大小寫視為相同
              -n   :順便輸出行號
              -v   :反向選擇,亦即顯示出沒有   '搜尋字串 '   內容的那一行!
  grep   -n   'the '   123.txt           搜索the字符   -----------搜尋特定字串               
  grep   -n   't[ea]st '   123.txt         搜索test或taste两个字符---------利用   []   來搜尋集合字元
  grep   -n   '[^g]oo '   123.txt           搜索前面不为g的oo-----------向選擇   [^]   
  grep   -n   '[0-9] '   123.txt     搜索有0-9的数字
  grep   -n   '^the '   123.txt   搜索以the为行首-----------行首搜索^
  grep   -n   '^[^a-zA-Z] '   123.txt     搜索不以英文字母开头
  grep   -n   '[a-z]$ '   123.txt         搜索以a-z结尾的行----------   行尾搜索$
  grep   -n   'g..d '   123.txt           搜索开头g结尾d字符----------任意一個字元   .   
  grep   -n   'ooo* '   123.txt           搜索至少有两个oo的字符---------重複字元   *
sed         文本流编辑器         利用脚本命令来处理文本文件
awd         模式扫描和处理语言
  nl   123.txt   |   sed   '2,5d '       删除第二到第五行的内容
diff           比较文件的差异
cmp             比较两个文件是否有差异
patch         修补文件
pr               要打印的文件格式化


帐号管理
/etc/passwd         系统帐号信息
/etc/shadow         帐号密码信息         经MD5   32位加密
          在密码栏前面加『   *   』『   !   』禁止使用某帐号
/etc/group           系统群组信息
/etc/gshadow
newgrp         改变登陆组
useradd     &     adduser         建立新用户     --------->   useradd   -m   test     自动建立用户的登入目录
                    useradd   -m   -g   pgroup   test   ---------> 指定所属级
/etc/default/useradd       相关设定
/etc/login.defs               UID/GID   有關的設定
passwd         更改密码   ----------->   passwd   test
usermod       修改用户帐号
userdel       删除帐号   -----------> userdel   -r   test
chsh             更换登陆系统时使用的SHELL       [-l]显示可用的SHELL;[-s]修改自己的SHELL
chfn             改变finger指令显示的信息
finger         查找并显示用户信息
id                 显示用户的ID   ----------->     id   test
groupadd       添加组
groupmod       与usermod类似
groupdel       删除组
su   test         更改用户       su   -         进入root,且使用root的环境变量
sudo               以其他身份来执行指令
visudo           编辑/etc/sudoers             加入一行『   test   ALL=(ALL)   ALL   』
                      %wheel   ALL   =   (ALL)   ALL                               系统里所有wheel群组的用户都可用sudo
                      %wheel   ALL   =   (ALL)   NOPASSWD:   ALL           wheel群组所有用户都不用密码NOPASSWD
              User_Alias   ADMPW   =   vbird,   dmtsai,   vbird1,   vbird3                   加入ADMPW组
              ADMPW   ALL   =   NOPASSWD:   !/usr/bin/passwd,   /usr/bin/passwd   [A-Za-z]*,   \
              !/usr/bin/passwd   root             可以更改使用者密码,但不能更改root密码   (在指令前面加入   !   代表不可)
PAM   (Pluggable   Authentication   Modules,   嵌入式模組)
who   &   w           看谁在线                                          
last                 最近登陆主机的信息
lastlog           最近登入的時間         读取   /var/log/lastlog   
talk                 与其他用户交谈
write               发送信息         write   test       [ctrl]+d   发送
mesg                 设置终端机的写入权限         mesg   n   禁止接收           mesg   y   
wall                 向所有用户发送信息         wall   this   is   q   test
mail                 写mail      
/etc/default/useradd         家目录默认设置
quota             显示磁盘已使用的空间与限制           quota   -guvs   -----> 秀出目前   root   自己的   quota   限制值
                      quota   -vu       查询
quotacheck       检查磁盘的使用空间与限制           quotacheck   -avug     -----> 將所有的在   /etc/mtab   內,含有   quota   支援的   partition   進行掃瞄
                          [-m]   强制扫描     
          quota一定要是独立的分区,要有quota.user和quota.group两件文件,在/etc/fstab添加一句:
          /dev/hda3   /home   ext3   defaults,usrquota,grpquota   1   2
          chmod   600   quota*                   设置完成,重启生效
edquota         编辑用户或群组的quota     用户,[g]群组,[p]复制,[t]设置宽限期限   
                      edquota   -a   yang               edquota   -p   yang   -u   young   -----> 复制         
quotaon         开启磁盘空间限制           quotaon   -auvg   --------> 啟動所有的具有   quota   的   filesystem
quotaoff       关闭磁盘空间限制           quotaoff   -a     --------> 關閉了   quota   的限制
repquota   -av           查閱系統內所有的具有   quota   的   filesystem   的限值狀態
Quota   從開始準備   filesystem   的支援到整個設定結束的主要的步驟大概是:
1、設定   partition   的   filesystem   支援   quota   參數:
由於   quota   必須要讓   partition   上面的   filesystem   支援才行,一般來說,   支援度最好的是   ext2/ext3   ,
其他的   filesystem   類型鳥哥我是沒有試過啦!   啟動   filesystem   支援   quota   最簡單就是編輯   /etc/fstab   ,
使得準備要開放的   quota   磁碟可以支援   quota   囉;
2、建立   quota   記錄檔:
剛剛前面講過,整個   quota   進行磁碟限制值記錄的檔案是   aquota.user/aquota.group,   
要建立這兩個檔案就必須要先利用   quotacheck   掃瞄才行喔!
3、編輯   quota   限制值資料:
再來就是使用   edquota   來編輯每個使用者或群組的可使用空間囉;
4、重新掃瞄與啟動   quota   :
設定好   quota   之後,建議可以再進行一次   quotacheck   ,然後再以   quotaon   來啟動吧!

开机流程简介
1、載入   BIOS   的硬體資訊,並取得第一個開機裝置的代號;   
2、讀取第一個開機裝置的   MBR   的   boot   Loader   (亦即是   lilo,   grub,   spfdisk   等等)   的開機資訊;   
3、載入   Kernel   作業系統核心資訊,   Kernel   開始解壓縮,並且嘗試驅動所有硬體裝置;   
4、Kernel   執行   init   程式並取得   run-level   資訊;   
5、init   執行   /etc/rc.d/rc.sysinit   檔案;   
6、啟動核心的外掛模組   (/etc/modprobe.conf);   
7、init   執行   run-level   的各個批次檔(   Scripts   );   
8、init   執行   /etc/rc.d/rc.local   檔案;   
9、執行   /bin/login   程式,並等待使用者登入;   
10、登入之後開始以   Shell   控管主機。   
在/etc/rc.d/rc3.d內,以S开头的为开机启动,以K开头的为关闭,接着的数字代表执行顺序
GRUB   vga设定
彩度\解析度     640x480     800x600     1024x768     1280x1024       bit   
        256                 769             771             773               775             8   bit   
      32768               784             787             790               793           15   bit   
      65536               785             788             791               794           16   bit   
      16.8M               786             789             792               795           32   bit   

./configure         检查系统信息               ./configure   --help   |   more     帮助信息
make   clean           清除之前留下的文件
make                       编译
make   install       安装
rpm   -q     -----> 查询是否安装                           rpm   -ql   ------> 查询该套件所有的目录
rpm   -qi   -----> 查询套件的说明资料               rpm   -qc[d]   -----> 设定档与说明档
rpm   -ivh     ----> 安装                                         rpm   -V     --------> 查看套件有否更动过
rpm   -e     ------> 删除                                         rpm   -Uvh   -------> 升级安装     
--nodeps   -----> 强行安装                                 --test   -----> 测试安装

查找端口:
netstat -anp | grep 7161
udp        0      0 10.168.25.74:27161      0.0.0.0:*                           32543/oamagent
查找进程:
ps -ef | grep 32543
oamjyy   32543 32485  0 Jan29 ?        00:00:08 oamagent

date 01091414 设置时间为:1月9日14点14分
date 0109:   设置时间为:1点09分

论坛徽章:
3
天秤座
日期:2013-12-27 13:44:58射手座
日期:2014-05-22 16:52:43天蝎座
日期:2014-08-13 16:03:21
42 [报告]
发表于 2014-05-24 00:11 |只看该作者
linux系统性能评估与优化  一、影响Linux服务器性能的因素

1. 操作系统级



&Oslash;       CPU

&Oslash;       内存

&Oslash;       磁盘I/O带宽

&Oslash;       网络I/O带宽



2.程序应用级



二、系统性能评估标准


影响性能因素
评判标准



糟糕

CPU
user% + sys%<70%
user% + sys%= 85%
user% + sys% >=90%

内存
Swap In  (si)=0

Swap Out(so)=0
Per CPU with 10 page/s
More Swap In & Swap Out

磁盘
iowait % < 20%
iowait % =35%
iowait % >= 50%




  

其中:

       %user:表示CPU处在用户模式下的时间百分比。

       %sys:表示CPU处在系统模式下的时间百分比。

       %iowait:表示CPU等待输入输出完成时间的百分比。

       swap in:即si,表示虚拟内存的页导入,即从SWAP DISK交换到RAM

       swap out:即so,表示虚拟内存的页导出,即从RAM交换到SWAP DISK。



三、系统性能分析工具



1.常用系统命令

Vmstat、sar、iostat、netstat、free、ps、top等



2.常用组合方式

• 用vmstat、sar、iostat检测是否是CPU瓶颈

• 用free、vmstat检测是否是内存瓶颈

• 用iostat检测是否是磁盘I/O瓶颈

• 用netstat检测是否是网络带宽瓶颈



四、Linux性能评估与优化



1. 系统整体性能评估(uptime命令)



[root@web1 ~]# uptime

16:38:00 up 118 days, 3:01, 5 users, load average: 1.22, 1.02, 0.91

这里需要注意的是:load average这个输出值,这三个值的大小一般不能大于系统CPU的个数,例如,本输出中系统有8个CPU,如果load average的三个值长期大于8时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于8时,倒不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的时间片,比如本例中的输出,CPU是非常空闲的。



1 cpu性能评估
Cpu是影响Linux性能的主要因素之一,下面先介绍几个查看CPU性能的命令。
1.1 vmstat命令
该命令可以显示关于系统各种资源之间相关性能的简要信息,这里我们主要用它来看CPU的一个负载情况。
下面是vmstat命令在某个系统的输出结果:
[root@node1 ~]# vmstat 2 3
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    0    162240   8304  67032   0    0    13    21   1007   23     0  1  98  0  0
0  0    0    162240   8304  67032   0    0     1     0   1010   20     0  1  100 0  0
0  0    0    162240   8304  67032   0    0     1     1   1009   18     0  1  99  0  0
对上面每项的输出解释如下:
? procs
? r列表示运行和等待cpu时间片的进程数,这个值如果长期大于系统CPU的个数,说明CPU不足,需要增加CPU。
? b列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
? memory
? swpd列表示切换到内存交换区的内存数量(以k为单位)。如果swpd的值不为0,或者比较大,只要si、so的值长期为0,这种情况下一般不用担心,不会影响系统性能。
? free列表示当前空闲的物理内存数量(以k为单位)
? buff列表示buffers cache的内存数量,一般对块设备的读写才需要缓冲。
? cache列表示page cached的内存数量,一般作为文件系统cached,频繁访问的文件都会被cached,如果cache值较大,说明cached的文件数较多,如果此时IO中bi比较小,说明文件系统效率比较好。
? swap
? si列表示由磁盘调入内存,也就是内存进入内存交换区的数量。
? so列表示由内存调入磁盘,也就是内存交换区进入内存的数量。
一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足。需要增加系统内存。
? IO项显示磁盘读写状况
? Bi列表示从块设备读入数据的总量(即读磁盘)(每秒kb)。
? Bo列表示写入到块设备的数据总量(即写磁盘)(每秒kb)
这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大,则表示系统磁盘IO有问题,应该考虑提高磁盘的读写性能。
? system 显示采集间隔内发生的中断数
? in列表示在某一时间间隔中观测到的每秒设备中断数。
? cs列表示每秒产生的上下文切换次数。
上面这2个值越大,会看到由内核消耗的CPU时间会越多。
? CPU项显示了CPU的使用状态,此列是我们关注的重点。
? us列显示了用户进程消耗的CPU 时间百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,就需要考虑优化程序或算法。
? sy列显示了内核进程消耗的CPU时间百分比。Sy的值较高时,说明内核消耗的CPU资源很多。
根据经验,us+sy的参考值为80%,如果us+sy大于 80%说明可能存在CPU资源不足。
? id 列显示了CPU处在空闲状态的时间百分比。
? wa列显示了IO等待所占用的CPU时间百分比。wa值越高,说明IO等待越严重,根据经验,wa的参考值为20%,如果wa超过20%,说明IO等待严重,引起IO等待的原因可能是磁盘大量随机读写造成的,也可能是磁盘或者磁盘控制器的带宽瓶颈造成的(主要是块操作)。
综上所述,在对CPU的评估中,需要重点注意的是procs项r列的值和CPU项中us、sy和id列的值。


1.2  sar命令
检查CPU性能的第二个工具是sar,sar功能很强大,可以对系统的每个方面进行单独的统计,但是使用sar命令会增加系统开销,不过这些开销是可以评估的,对系统的统计结果不会有很大影响。
下面是sar命令对某个系统的CPU统计输出:
[root@webserver ~]# sar -u 3 5
Linux 2.6.9-42.ELsmp (webserver)        11/28/2008      _i686_  (8 CPU)

11:41:24 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
11:41:27 AM     all      0.88      0.00      0.29      0.00      0.00     98.83
11:41:30 AM     all      0.13      0.00      0.17      0.21      0.00     99.50
11:41:33 AM     all      0.04      0.00      0.04      0.00      0.00     99.92
11:41:36 AM     all      0.29      0.00      0.13      0.00      0.00     99.58
11:41:39 AM     all      0.38      0.00      0.17      0.04      0.00     99.41
Average:        all      0.34      0.00      0.16      0.05      0.00     99.45
对上面每项的输出解释如下:
? %user列显示了用户进程消耗的CPU 时间百分比。
? %nice列显示了运行正常进程所消耗的CPU 时间百分比。
? %system列显示了系统进程消耗的CPU时间百分比。
? %iowait列显示了IO等待所占用的CPU时间百分比
? %steal列显示了在内存相对紧张的环境下pagein强制对不同的页面进行的steal操作 。
? %idle列显示了CPU处在空闲状态的时间百分比。
这个输出是对系统整体CPU使用状况的统计,每项的输出都非常直观,并且最后一行Average是个汇总行,是上面统计信息的一个平均值。
需要注意的一点是:第一行的统计信息中包含了sar本身的统计消耗,所以%user列的值会偏高一点,不过,这不会对统计结果产生多大影响。
在一个多CPU的系统中,如果程序使用了单线程,会出现这么一个现象,CPU的整体使用率不高,但是系统应用却响应缓慢,这可能是由于程序使用单线程的原因,单线程只使用一个CPU,导致这个CPU占用率为100%,无法处理其它请求,而其它的CPU却闲置,这就导致 了整体CPU使用率不高,而应用缓慢 现象的发生 。
针对这个问题,可以对系统的每个CPU分开查询,统计每个CPU的使用情况:
[root@webserver ~]# sar -P 0 3 5
Linux 2.6.9-42.ELsmp (webserver)        11/29/2008      _i686_  (8 CPU)

06:29:33 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
06:29:36 PM       0      3.00      0.00      0.33      0.00      0.00     96.67
06:29:39 PM       0      0.67      0.00      0.33      0.00      0.00     99.00
06:29:42 PM       0      0.00      0.00      0.33      0.00      0.00     99.67
06:29:45 PM       0      0.67      0.00      0.33      0.00      0.00     99.00
06:29:48 PM       0      1.00      0.00      0.33      0.33      0.00     98.34
Average:          0      1.07      0.00      0.33      0.07      0.00     98.53
这个输出是对系统的第一颗CPU的信息统计,需要注意的是,sar中对CPU的计数是从0开始的,因此,“sar -P 0 3 5”表示对系统的第一颗CPU进行信息统计,“sar -P 4 3 5”则表示对系统的第五颗CPU进行统计。依次类推。可以看出,上面的系统有八颗CPU。


1.3 iostat命令
iostat指令主要用于统计磁盘IO状态,但是也能查看CPU的使用信息,它的局限性是只能显示系统所有CPU的平均信息,看下面的一个输出:
[root@webserver ~]# iostat  -c
Linux 2.6.9-42.ELsmp (webserver)        11/29/2008      _i686_  (8 CPU)

avg-cpu:  %user   %nice   %system  %iowait  %steal   %idle
           2.52    0.00    0.30     0.24     0.00    96.96
在这里,使用了“-c”参数,只显示系统CPU的统计信息,输出中每项代表的含义与sar命令的输出项完全相同,不再详述。


1.4 uptime

命令
uptime是监控系统性能最常用的一个命令,主要用来统计系统当前的运行状况,输出的信息依次为:系统现在的时间、系统从上次开机到现在运行了多长时间、系统目前有多少登陆用户、系统在一分钟内、五分钟内、十五分钟内的平均负载。看下面的一个输出:
[root@webserver ~]# uptime
18:52:11 up 27 days, 19:44,  2 users,  load average: 0.12, 0.08, 0.08
这里需要注意的是load average这个输出值,这三个值的大小一般不能大于系统CPU的个数,例如,本输出中系统有8个CPU,如果load average的三个值长期大于8时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于8时,倒不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的时间片,比如本例中的输出,CPU是非常空闲的。


1.5

本节小结
       上面介绍了检查CPU使用状况的四个命令,通过这些命令需要了解的是:系统CPU是否出现性能瓶颈,也就是说,以上这些命令只能查看CPU是否繁忙,负载是否过大,但是无法知道CPU为何负载过大,因而,判断系统CPU出现问题后,要结合top、ps等命令进一步检查是由那些进程导致CPU负载过大的。引起CPU资源紧缺的原因可能是应用程序不合理造成的,也可能是硬件资源匮乏引起的,所以,要具体问题具体分析,或者优化应用程序,或者增加系统CPU资源。


2 内存性能评估
      内存的管理和优化是系统性能优化的一个重要部分,内存资源的充足与否直接影响应用系统的使用性能,在进行内存优化之前,一定要熟悉linux的内存管理机制,这一点我们在前面的章节已经有深入讲述,本节的重点是如何通过系统命令监控linux系统的内存使用状况。
2.1 free 命令
free是监控linux内存使用状况最常用的指令,看下面的一个输出:
[root@webserver ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          8111       7185        925          0        243       6299
-/+ buffers/cache:        643       7468
Swap:         8189          0       8189
  “free –m”表示以M为单位查看内存使用情况,在这个输出中,重点关注的应该是free列与cached列的输出值,由输出可知,此系统共8G内存,系统空闲内存还有925M,其中,Buffer Cache占用了243M,Page Cache占用了6299M,由此可知系统缓存了很多的文件和目录,而对于应用程序来说,可以使用的内存还有7468M,当然这个7468M包含了Buffer Cache和Page Cache的值。在swap项可以看出,交换分区还未使用。所以从应用的角度来说,此系统内存资源还非常充足。
    一般有这样一个经验公式:应用程序可用内存/系统物理内存>70%时,表示系统内存资源非常充足,不影响系统性能,应用程序可用内存/系统物理内存<20%时,表示系统内存资源紧缺,需要增加系统内存,20%<应用程序可用内存/系统物理内存<70%时,表示系统内存资源基本能满足应用需求,暂时不影响系统性能。
  free命令还可以适时的监控内存的使用状况,使用“-s”参数可以在指定的时间段内不间断的监控内存的使用情况:
[root@webserver ~]# free -b -s 5
total       used       free     shared    buffers     cached
Mem:    8505901056 7528706048  977195008          0  260112384 6601158656
-/+ buffers/cache:  667435008 7838466048
Swap:   8587149312     163840 8586985472

             total       used       free     shared    buffers     cached
Mem:    8505901056 7526936576  978964480          0  260128768 6601142272
-/+ buffers/cache:  665665536 7840235520
Swap:   8587149312     163840 8586985472

             total       used       free     shared    buffers     cached
Mem:    8505901056 7523987456  981913600          0  260141056 6601129984
-/+ buffers/cache:  662716416 7843184640
Swap:   8587149312     163840 8586985472
  其中,“-b”表示以千字节(也就是1024字节为单位)来显示内存使用情况。


2.2 通过watch与free相结合动态监控内存状况
watch是一个非常有用的命令,几乎每个linux发行版都带有这个工具,通过watch,可以动态的监控命令的运行结果,省去手动执行的麻烦。
  可以在watch后面跟上需要运行的命令,watch就会自动重复去运行这个命令,默认是2秒钟执行一次,并把执行的结果更新在屏幕上。例如:
[root@webserver ~]# watch -n 3 -d free
Every 3.0s: free                                   Sun Nov 30 16:23:20 2008

             total       used       free     shared    buffers     cached
Mem:       8306544    7349548     956996          0     203296    6500024
-/+ buffers/cache:     646228    7660316
Swap:      8385888        160    8385728
其中,“-n”指定重复执行的时间,“-d”表示高亮显示变动。


2.3 vmstat

命令监控内存
vmstat命令在监控系统内存方面功能强大,请看下面的一个输出:
procs  -----------memory----------  ---swap--  -----io---- --system--   ----cpu----
r  b   swpd    free buff    cache   si   so    bi    bo    in    cs    us sy id   wa
0  0  906440  22796 155616 1325496  340  180    2     4     1     4    80  0  10  10
0  0  906440  42796 155616 1325496  320  289    0    54    1095  287   70  15  0  15
0  0  906440  42884 155624 1325748  236  387    2   102    1064   276  78  2   5  15
对于内存的监控,在vmstat中重点关注的是swpd、si和so行,从这个输出可以看出,此系统内存资源紧缺,swpd占用了900M左右内存,si和so占用很大,而由于系统内存的紧缺,导致出现15%左右的系统等待,此时增加系统的内存是必须要做的。


2.4 sar -r命令组合
sar命令也可以监控linux的内存使用状况,可以通过“sar –r”组合查看系统内存和交换空间的使用率。请看下面的一个输出:
[root@webserver ~]# sar -r 2 3
Linux 2.6.9-42.ELsmp (webserver)        11/30/2008      _i686_  (8 CPU)

09:57:33 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
09:57:35 PM    897988   7408556     89.19    249428   6496532    786556      4.71
09:57:37 PM    898564   7407980     89.18    249428   6496532    784276      4.70
09:57:39 PM    899196   7407348     89.17    249440   6496520    782132      4.69
Average:       898583   7407961     89.18    249432   6496528    784321      4.70
其中:
Kbmemfree表示空闲物理内存大小,kbmemused表示已使用的物理内存空间大小,%memused表示已使用内存占总内存大小的百分比,kbbuffers和kbcached分别表示Buffer Cache和Page Cache的大小,kbcommit和%commit分别表示应用程序当前使用的内存大小和使用百分比。
可以看出sar的输出其实与free的输出完全对应,不过sar更加人性化,不但给出了内存使用量,还给出了内存使用的百分比以及统计的平均值。从%commit项可知,此系统目前内存资源充足。


2.5  本节小结
上面介绍了内存监控常用的几个指令以及一些经验规则,其实现在的系统在内存方面出现的瓶颈已经很少,因为内存价格很低,充足的内存已经完全能满足应用程序和系统本身的需要,如果系统在内存方面出现瓶颈,很大的可能是应用程序本身的问题造成的。



3 磁盘I/O性能评估
在对磁盘I/O性能做评估之前,必须知道的几个方面是:
? 熟悉RAID存储方式,可以根据应用的不同,选择不同的RAID方式,例如,如果一个应用经常有大量的读操作,可以选择RAID5方式构建磁盘阵列存储数据,如果应用有大量的、频繁的写操作,可以选择raid0存取方式,如果应用对数据安全要求很高,同时对读写也有要求的话,可以考虑raid01存取方式等等。
? 尽可能用内存的读写代替直接磁盘I/O,使频繁访问的文件或数据放入内存中进行操作处理,因为内存读写操作比直接磁盘读写的效率要高千倍。
? 将经常进行读写的文件与长期不变的文件独立出来,分别放置到不同的磁盘设备上。
? 对于写操作频繁的数据,可以考虑使用裸设备代替文件系统。这里简要讲述下文件系统与裸设备的对比:
使用裸设备的优点有:
? 数据可以直接读写,不需要经过操作系统级的缓存,节省了内存资源,避免了内存资源争用。
? 避免了文件系统级的维护开销,比如文件系统需要维护超级块、I-node等。
? 避免了操作系统的cache预读功能,减少了I/O请求。
使用裸设备的缺点是:
? 数据管理、空间管理不灵活,需要很专业的人来操作。
其实裸设备的优点就是文件系统的缺点,反之也是如此,这就需要我们做出合理的规划和衡量,根据应用的需求,做出对应的策略。
下面接着介绍对磁盘IO的评估标准。
3.1 sar -d命令组合
通过“sar –d”组合,可以对系统的磁盘IO做一个基本的统计,请看下面的一个输出:
[root@webserver ~]# sar -d 2 3
Linux 2.6.9-42.ELsmp (webserver)        11/30/2008      _i686_  (8 CPU)

11:09:33 PM  DEV   tps   rd_sec/s wr_sec/s  avgrq-sz  avgqu-sz  await  svctm   %util
11:09:35 PM dev8-0  0.00  0.00     0.00      0.00      0.00      0.00   0.00    0.00

11:09:35 PM  DEV   tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz  await   svctm   %util
11:09:37 PM dev8-0  1.00  0.00     12.00     12.00      0.00     0.00    0.00    0.00

11:09:37 PM   DEV   tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz  await  svctm  %util
11:09:39 PM dev8-0  1.99   0.00    47.76     24.00     0.00      0.50    0.25    0.05

Average:  DEV     tps    rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz  await  svctm   %util
Average:  dev8-0  1.00   0.00      19.97     20.00      0.00     0.33    0.17    0.02
对上面每项的输出解释如下:
? DEV表示磁盘设备名称。
? tps表示每秒到物理磁盘的传送数,也就是每秒的I/O流量。一个传送就是一个I/O请求,多个逻辑请求可以被合并为一个物理I/O请求。
? rd_sec/s表示每秒从设备读取的扇区数(1扇区=512字节)。
? wr_sec/s表示每秒写入设备的扇区数目。
? avgrq-sz表示平均每次设备I/O操作的数据大小(以扇区为单位)。
? avgqu-sz表示平均I/O队列长度。
? await表示平均每次设备I/O操作的等待时间(以毫秒为单位)。
? svctm表示平均每次设备I/O操作的服务时间(以毫秒为单位)。
? %util表示一秒中有百分之几的时间用于I/O操作。
Linux中I/O请求系统与现实生活中超市购物排队系统有很多类似的地方,通过对超市购物排队系统的理解,可以很快掌握linux中I/O运行机制。比如:
avgrq-sz类似与超市排队中每人所买东西的多少。
avgqu-sz类似与超市排队中单位时间内平均排队的人数。
await类似与超市排队中每人的等待时间。
svctm类似与超市排队中收银员的收款速度。
%util类似与超市收银台前有人排队的时间比例。
对以磁盘IO性能,一般有如下评判标准:
正常情况下svctm应该是小于await值的,而svctm的大小和磁盘性能有关,CPU、内存的负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加。
await值的大小一般取决与svctm的值和I/O队列长度以及I/O请求模式,如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。
%util项的值也是衡量磁盘I/O的一个重要指标,如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去,势必影响系统的性能,可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题。


3.2 iostat –d命令组合
通过“iostat –d”命令组合也可以查看系统磁盘的使用状况,请看如下输出:
[root@webserver ~]#   iostat -d 2 3
Linux 2.6.9-42.ELsmp (webserver)        12/01/2008      _i686_  (8 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               1.87         2.58       114.12    6479462  286537372

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.00         0.00         0.00          0          0

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               1.00         0.00        12.00          0         24
对上面每项的输出解释如下:
? Blk_read/s表示每秒读取的数据块数。
? Blk_wrtn/s表示每秒写入的数据块数。
? Blk_read表示读取的所有块数
? Blk_wrtn表示写入的所有块数。
这里需要注意的一点是:上面输出的第一项是系统从启动以来到统计时的所有传输信息,从第二次输出的数据才代表在检测的时间段内系统的传输值。
可以通过Blk_read/s和Blk_wrtn/s的值对磁盘的读写性能有一个基本的了解,如果Blk_wrtn/s值很大,表示磁盘的写操作很频繁,可以考虑优化磁盘或者优化程序,如果Blk_read/s值很大,表示磁盘直接读取操作很多,可以将读取的数据放入内存中进行操作。对于这两个选项的值没有一个固定的大小,根据系统应用的不同,会有不同的值,但是有一个规则还是可以遵循的:长期的、超大的数据读写,肯定是不正常的,这种情况一定会影响系统性能。
“iostat –x”组合还提供了对每个磁盘的单独统计,如果不指定磁盘,默认是对所有磁盘进行统计,请看下面的一个输出:
[root@webserver ~]#   iostat -x /dev/sda  2 3
Linux 2.6.9-42.ELsmp (webserver)        12/01/2008      _i686_  (8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.45    0.00    0.30    0.24    0.00   97.03

Device: rrqm/s  wrqm/s  r/s  w/s  rsec/s  wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda   0.01     12.48    0.10  1.78  2.58   114.03    62.33   0.07    38.39   1.30   0.24

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           3.97    0.00    1.83    8.19    0.00   86.14

Device:rrqm/s wrqm/s   r/s  w/s   rsec/s  wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda    0.00   195.00  0.00 18.00  0.00  1704.00    94.67     0.04    2.50   0.11   0.20

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           4.04    0.00    1.83    8.01    0.00   86.18

Device: rrqm/s  wrqm/s  r/s  w/s   rsec/s   wsec/s avgrq-sz avgqu-sz     await  svctm  %util
sda    0.00     4.50    0.00   7.00   0.00    92.00    13.14     0.01    0.79   0.14   0.10
这个输出基本与“sar –d”相同,需要说明的几个选项的含义为:
? rrqm/s表示每秒进行merged的读操作数目。
? wrqm/s表示每秒进行 merge 的写操作数目。
? r/s表示每秒完成读I/O设备的次数。
? w/s表示每秒完成写I/O设备的次数。
? rsec/s表示每秒读取的扇区数。
? wsec/s表示每秒写入的扇区数。


3.3 vmstat –d组合
通过“vmstat –d”组合也可以查看磁盘的统计数据,情况下面的一个输出:

[root@webserver ~]# vmstat -d 3 2|grep sda
disk- ------------reads------------ ------------writes----------- -----IO------
     total  merged sectors    ms    total    merged   sectors      ms     cur    sec
sda  239588 29282  6481862  1044442 4538678  32387680 295410812  186025580  0   6179
disk- ------------reads------------ ------------writes----------- -----IO------
     total  merged  sectors  ms    total     merged    sectors     ms     cur   sec
sda  239588 29282  6481862 1044442 4538680   32387690 295410908 186025581  0   6179
这个输出显示了磁盘的reads、writes和IO的使用状况。


3.4

本节小结
上面主要讲解了对磁盘I/O的性能评估,其实衡量磁盘I/O好坏是多方面的,有应用程序本身的,也有硬件设计上的,还有系统自身配置的问题等,要解决I/O的瓶颈,关键是要提高I/O子系统的执行效率。例如,首要要从应用程序上对磁盘读写进行优化,能够放到内存执行的操作,尽量不要放到磁盘,同时对磁盘存储方式进行合理规划,选择适合自己的RAID存取方式,最后,在系统级别上,可以选择适合自身应用的文件系统,必要时使用裸设备提高读写性能。



4 网络性能评估
网络性能的好坏直接影响应用程序对外提供服务的稳定性和可靠性,监控网络性能,可以从以下几个方面进行管理和优化。
4.1 通过ping命令检测网络的连通性
如果发现网络反应缓慢,或者连接中断,可以通过ping来测试网络的连通情况,请看下面的一个输出:
[root@webserver ~]# ping 10.10.1.254
PING 10.10.1.254 (10.10.1.254) 56(84) bytes of data.
64 bytes from 10.10.1.254: icmp_seq=0 ttl=64 time=0.235 ms
64 bytes from 10.10.1.254: icmp_seq=1 ttl=64 time=0.164 ms
64 bytes from 10.10.1.254: icmp_seq=2 ttl=64 time=0.210 ms
64 bytes from 10.10.1.254: icmp_seq=3 ttl=64 time=0.178 ms
64 bytes from 10.10.1.254: icmp_seq=4 ttl=64 time=0.525 ms
64 bytes from 10.10.1.254: icmp_seq=5 ttl=64 time=0.571 ms
64 bytes from 10.10.1.254: icmp_seq=6 ttl=64 time=0.220 ms
--- 10.10.1.254 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6000ms
rtt min/avg/max/mdev = 0.164/0.300/0.571/0.159 ms, pipe 2
在这个输出中,time值显示了两台主机之间的网络延时情况,如果此值很大,则表示网络的延时很大,单位为毫秒。在这个输出的最后,是对上面输出信息的一个总结,packet loss表示网络的丢包率,此值越小,表示网络的质量越高。


4.2 通过netstat –i组合检测网络接口状况
netstat命令提供了网络接口的详细信息,请看下面的输出:
[root@webserver ~]# netstat -i
Kernel Interface table
Iface MTU  Met RX-OK     RX-ERR RX-DRP RX-OVR   TX-OK    TX-ERR TX-DRP TX-OVR       Flg
eth0  1500  0 1313129253  0      0       0     1320686497    0      0      0        BMRU
eth1  1500  0 494902025   0      0       0     292358810     0      0      0        BMRU
lo   16436  0 41901601    0      0       0     41901601      0      0      0        LRU
对上面每项的输出解释如下:
? Iface表示网络设备的接口名称。
? MTU表示最大传输单元,单位字节。
? RX-OK/TX-OK表示已经准确无误的接收/发送了多少数据包。
? RX-ERR/TX-ERR表示接收/发送数据包时产生了多少错误。
? RX-DRP/TX-DRP表示接收/发送数据包时丢弃了多少数据包。
? RX-OVR/TX-OVR表示由于误差而遗失了多少数据包。
? Flg表示接口标记,其中:
? L:表示该接口是个回环设备。
? B:表示设置了广播地址。
? M:表示接收所有数据包。
? R:表示接口正在运行。
? U:表示接口处于活动状态。
? O:表示在该接口上禁用arp。
? P:表示一个点到点的连接。
正常情况下,RX-ERR/TX-ERR、RX-DRP/TX-DRP和RX-OVR/TX-OVR的值都应该为0,如果这几个选项的值不为0,并且很大,那么网络质量肯定有问题,网络传输性能也一定会下降。
当网络传输存在问题是,可以检测网卡设备是否存在故障,如果可能,可以升级为千兆网卡或者光纤网络,还可以检查网络部署环境是否合理。


4.3 通过netstat –r组合检测系统的路由表信息
在网络不通,或者网络异常时,首先想到的就是检查系统的路由表信息,“netstat –r”的输出结果与route命令的输出完全相同,请看下面的一个实例:
[root@webserver ~]#  netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.10.1.0       *               255.255.255.0   U         0   0       0  eth0
192.168.200.0   *               255.255.255.0   U         0   0       0  eth1
169.254.0.0     *               255.255.0.0     U         0   0       0  eth1
default         10.10.1.254     0.0.0.0         UG        0   0       0  eth0
关于输出中每项的具体含义,已经在前面章节进行过详细介绍,这里不再多讲,这里我们重点关注的是default行对应的值,default项表示系统的默认路由,对应的网络接口为eth0。


4.4 通过sar –n组合显示系统的网络运行状态
sar提供四种不同的选项来显示网络统计信息,通过“-n”选项可以指定4个不同类型的开关:DEV、EDEV、SOCK和FULL。DEV显示网络接口信息,EDEV显示关于网络错误的统计数据,SOCK显示套接字信息,FULL显示所有三个开关。请看下面的一个输出:
[root@webserver ~]# sar -n DEV 2 3
Linux 2.6.9-42.ELsmp (webserver)        12/01/2008      _i686_  (8 CPU)

02:22:31 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
02:22:33 PM        lo     31.34     31.34     37.53     37.53      0.00      0.00      0.00
02:22:33 PM      eth0    199.50    279.60     17.29    344.12      0.00      0.00      0.00
02:22:33 PM      eth1      5.47      4.98      7.03      0.36      0.00      0.00      0.00
02:22:33 PM      sit0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

02:22:33 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
02:22:35 PM        lo     67.66     67.66     74.34     74.34      0.00      0.00      0.00
02:22:35 PM      eth0    159.70    222.39     19.74    217.16      0.00      0.00      0.00
02:22:35 PM      eth1      3.48      4.48      0.44      0.51      0.00      0.00      0.00
02:22:35 PM      sit0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

02:22:35 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
02:22:37 PM        lo      4.52      4.52      9.25      9.25      0.00      0.00      0.00
02:22:37 PM      eth0    102.51    133.67     20.67    116.14      0.00      0.00      0.00
02:22:37 PM      eth1     27.14     67.34      2.42     89.26      0.00      0.00      0.00
02:22:37 PM      sit0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
Average:           lo     34.61     34.61     40.48     40.48      0.00      0.00      0.00
Average:         eth0    154.08    212.15     19.23    226.17      0.00      0.00      0.00
Average:         eth1     11.98     25.46      3.30     29.85      0.00      0.00      0.00
Average:         sit0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
对上面每项的输出解释如下:
? IFACE表示网络接口设备。
? rxpck/s表示每秒钟接收的数据包大小。
? txpck/s表示每秒钟发送的数据包大小。
? rxkB/s表示每秒钟接收的字节数。
? txkB/s表示每秒钟发送的字节数。
? rxcmp/s表示每秒钟接收的压缩数据包。
? txcmp/s表示每秒钟发送的压缩数据包。
? rxmcst/s表示每秒钟接收的多播数据包。
通过“sar –n”的输出,可以清楚的显示网络接口发送、接收数据的统计信息。此外还可以通过“sar -n EDEV 2 3”来统计网络错误信息等。


4.5 小结
      本节通过几个常用的网络命令介绍了对网络性能的评估,事实上,网络问题是简单而且容易处理的,只要我们根据上面给出的命令,一般都能迅速定位问题。解决问题的方法一般是增加网络带宽,或者优化网络部署环境。
      除了上面介绍的几个命令外,排查网络问题经常用到的命令还有traceroute,主要用于跟踪数据包的传输路径,还有nslookup命令,主要用于判断DNS解析信息。

论坛徽章:
3
天秤座
日期:2013-12-27 13:44:58射手座
日期:2014-05-22 16:52:43天蝎座
日期:2014-08-13 16:03:21
43 [报告]
发表于 2014-05-24 00:12 |只看该作者
Linux 常用命令和技巧
liunx日常小技巧
改变文件或目录之读、写、执行之允许权
====================================
执行格式:chmod [-R] mode name ( name 可为文件名或目录名;mode可为 3 个 8 位元之数字,或利用ls -l 命令,列出文件或目录之读、写、执行允许权之文字缩写。)
mode : rwx rwx rwx r:read w:write x:execute(user group other 缩写为: u g o)
Example :
% chmod 755 dir1 将目录dir1,设定成任何使用者,皆有读取及执行之权利,但只有拥有者可做修改。
% chmod 700 file1 将文件file1,设定只有拥有者可以读、写和执行。
% chmod o+x file2 将文件file2,增加拥有者可以执行之权利。
% chmod g+x file3 将文件file3,增加群组使用者可执行之权利。
% chmod o-r file4 将文件file4,除去其它使用者可读取之权利。
改变文件或目录之拥有权
======================
执行格式:chown [-R] username name ( name 可为文件名或目录名。)
Example :
% chown user file1 将文件 file1 之拥有权,改为使用者 user 所有。
% chown -R user dir1 将目录 dir1,及其下所有文件和子目录之拥有权,改为使用者 user 所有。
检查自己所属之群组名称
======================
执行格式:groups
Example :
% groups
改变文件或目录之群组拥有权
==========================
执行格式:chgrp [-R] groupname name ( name 可为文件名或目录名 )
Example :
% chgrp vlsi file1 将文件 file1 之群组拥有权,改为 vlsi 群组。
% chgrp -R image dir1 将目录dir1,及其下所有文件和子目录,改为 image 群组。

改变文件或目录之最后修改时间(
变为当前时间)
=========================================
执行格式:touch name ( name 可为文件或目录名称。)
Example :
% touch file1
% touch dir1
文件之连结
=================
同一文件,可拥有一个以上之名称,可将文件做数个连结。
执行格式:ln oldname newname ( Hard link )
Example :
% ln file1 file2   将名称 file2,连结至文件 file1。
执行格式:ln -s oldname newname ( Symblick link )
Example :
% ln -s file3 file4 将名称 file4,连结至文件file3。
文件之字串找寻
==============
执行格式:grep string file
Example :
% grep abc file1 寻找文件file1中,列出字串 abc 所在之整行文字内容。
找寻文件或命令之路径
====================
执行格式:whereis command ( 显示命令之路径。)
执行格式:which command ( 显示命令之路径,及使用者所定义之别 )
执行格式:whatis command ( 显示命令功能之摘要。)
执行格式:find search-path -name filename -print ( 搜寻指定路径下,某文件之路径 )
Example :
% find / -name file1 -print ( 自根目录下,寻找文件名为 file1 之路径)
比较文件或目录之内容
====================
执行格式:diff [-r] name1 name2 ( name1 name2 可同时为文件名,或目录名称 )
Example :
% diff file1 file2 比较文件 file1 与 file2 内,各行之不同处。
% diff -r dir1 dir2 比较目录 dir1 与 dir2 内,各文件之不同处。
如何实现为一个网卡绑定多个IP地址?
====================================
  Linux的网络设备配置文件存放在/etc/sysconfig/network-scripts里面,对于以太网的第一个网络设备,配置文件名一般为 ifcfg-eth0 如果需要为第一个网络设备绑定多一个IP地址,只需要在/etc/sysconfig/network-scripts目录里面创建一个名为ifcfg- eth0:0的文件,内容样例为:
DEVICE="eth0:0"
IPADDR="211.100.10.119"
NETMASK="255.255.255.0"
ONBOOT="yes"
  其中的DEVICE为设备的名称,IPADDR为此设备的IP地址,NETMASK为子网掩码,ONBOOT表示在系统启动时自动启动。
  如果需要再绑定多一个IP地址,只需要把文件名和文件内的DEVICE中的eth0加一即可。LINUX最多可以支持255个IP别名。
如何设置login后欢迎信息
====================================
  修改/etc/motd,往里面写入文本,就能使用户通过telnet正确登录后执行shell之前得到相应的提示信息。
  motd就是“messages of the day”,也就是当日信息的意思。管理员可以往里面写一些需要注意的事项或者通知等来提醒正式用户。
如何设置login前欢迎界面
====================================
  修改/etc/issue或者issue.net,往里面写入文本,就能使得用户在login前得到相应的提示,这将有助于用户分辨自己正在连接哪里的主机。
  issue的内容是出现在本机登录的用户界面上,而issue.net则是在用户通过网络telnet的时候出现。
如何在bash下快速执行某个特定历史命令
====================================
在bash下面按ctrl+r可以查找历史命令中匹配的命令并执行
如何查看进程继承关系
====================================
直接在命令行中输入
pstree
即可,程序会以树状结构方式列出系统中正在运行的各进程之间的继承关系。
如何找出内存占用最大的进程
====================================
除了可以使用top命令查看内存使用情况之外,还可以使用更快的命令行命令,相关的命令如下:
ps aux | sort +4n
或者
ps aux | sort +5n
如何在Linux下面编辑二进制文件
====================================
http://freshmeat.net/redir/hexed ... xedit-1.2.3.src.tgz下载hexedit安装到系统上,就能用hexedit filename来编辑二进制文件。
如何设置用户密码过期时间
====================================
设置某个用户的密码过期时间可以用usermod -e来设置,如果要统一设置用户的密码过期时间,那么就要修改/etc/login.defs里面的PASS_MAX_DAYS,比如修改所有用户的密码过期时间是30天:
PASS_MAX_DAYS 30
如果这个值是99999,那么表示密码永不过期。
如何修改网卡MAC地址
====================================
首先必须关闭网卡设备,否则会报告系统忙,无法更改。
命令是: /sbin/ifconfig eth0 down
修改 MAC 地址,这一步较 Windows 中的修改要简单。
命令是:/sbin/ifconfig eth0 hw ether 00:AA:BB:CCD:EE
重新启用网卡 /sbin/ifconfig eht0 up
网卡的 MAC 地址更改就完成了
如何用Bash纠正错误命令
====================================
当你输入一个命令不知道是否正确的时候,可以使用ctrl+t来纠正到正确的命令。
比如输入mkdri,然后按ctrl+t,bash会帮你纠正到最接近的命令mkdir。
如何不显示其他用户的消息
====================================
用户可以使用mesg n来禁止别人给他发送信息,其实就是禁止别人往自己的终端上面的写权限。当别人试图再使用write给他发送信息时,发送者将会看见提示:
write: user has messages disabled on pts/n
如何知道某个命令使用了什么库文件
====================================
例如要知道ls使用了什么库文件,可以使用:
$ ldd /bin/ls
如何临时增加交换空间
====================================
产生一个64M的空文件
#dd if=/dev/zero of=/swapfile bs=1024 count=65536
初始化该文件为交换文件:
mkswap /swapfile 65536
sync
激活这个交换文件:
swapon /swapfile
如何使一个用户进程在用户退出系统后仍然运行
====================================
  使用nohup command &,比如:
  nohup wget -c ftp://test.com/test.iso
  这样即使用户退出系统,wget进程仍然继续运行直到test.iso下载完成为止
如何限制用户的最小密码长度
====================================
修改/etc/login.defs里面的PASS_MIN_LEN的值。比如限制用户最小密码长度是8:
PASS_MIN_LEN 8
这样用户设置密码的时候如果输入的密码长度小于8将不能设置
如何限制只有0组(gid=0)的用户可以su成root
====================================
修改/etc/login.defs里面的SU_WHEEL_ONLY的值为:
SU_WHEEL_ONLY yes
那么就只有gid为0的用户可以su成root。
如何禁用Ctrl+Alt+Del键重启系统
====================================
有时候为了防止误操作导致系统重新启动(如机房里面新来了个习惯用Window$系统的管理员),或者出于安全的原因,需要禁用Ctrl+Alt+Del组合键。
只需要注释掉/etc/inittab文件内的
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
这一行即可。如何注释?在这一行的行首放一个“#”号即可。
怎么样格式化磁盘
====================================
Linux下有一条mkfs命令,相当于format,可以对磁盘进行文件系统制作操作(或者说格式化)。命令的语法为:
mkfs -t 文件系统类型 /dev/设备名
如要把/dev/sda1格式为reiserfs格式,使用以下命令:
mkfs -t reiserfs /dev/sda1
当然,也可以使用mkfs.fstype命令来格式化磁盘,其中的fstype为文件系统名,如reiserfs文件系统的格式化命令为mkfs.reiserfs。上面那条命令的相应版本为:
mkfs.reiserfs /dev/sda1
如何取消root命令历史记录以增加安全性
====================================
  为了设置系统不记录每个人执行过的命令,就在/etc/profile里设置:
  HISTFILESIZE=0
  HISTSIZE=0
  或者:
  ln -s /dev/null ~/.bash_history
  这样就可以了。
如何使用netrc文件进行自动ftp
====================================
在自己的home目录下建立一个权限600,名为.netrc的文件,内容是:
machine 192.168.0.1 login test password test
这样以后你每次ftp 192.168.0.1的时候,系统都会帮你以用户名test,密码test登录。
利用这个特征可以实现自动ftp。
例如你想要每天5:00到192.168.0.1机器上面获得/test目录下的文件test.txt,可以这么做:
建立一个文件ftp_cmd,内容为:
cd test
get test.txt
bye
然后使用crontab -e设置定时任务:
0 5 * * * ftp 192.168.0.1
如何测试硬盘性能
====================================
使用hdparm -t -T /dev/hdX就可以测试硬盘的buffer-cache reads和buffered disk reads两个数据,可以用来当作硬盘性能的参考。
同时使用hdparm -c3 /dev/hdaX还能设置硬盘以32bit传输,以加快数据传输的速度。
压缩和打包文件
====================================
.bz2 文件如何解压缩 用tar -I 或者bunzip2 命令都可以。
.bz2 — 使用bzip2命令压缩的文件,可以使用bzip2 -d filename 解包
.gz — 使用gzip命令压缩的文件,可以使用gunzip -d filename 解包
.tar — 使用tar打包的文件,即tarball文件,可以使用tar xf filename 解包
.tbz — 使用tar打完包后再以bzip2命令压缩的文件,可以使用tar jxf filename 解包
.tgz — 使用tar打完包后再以gzip命令压缩的文件,可以使用tar zxf filename 解包
个人总结:
[.tar] 解开:tar xvf *.tar 把文件打包不压缩:tar cvf *.tar DirName
[.tar.gz]解开:tar xzvf *.tar.gz 把文件打包并压缩:tar czvf *.tar.gz DirName
[.bz2] 解开:bzip2 -d *.bz2
[.bz] 解开:bzip -d *.bz
[.gz] 解开:gzip -d *.gz
如何对光驱、软驱实现AutoMount
====================================
安装完Redhat Linux之后,运行ntsysv,选中服务后台程序autofs.autofs的两个配置文件在/etc/auto.misc和 /etc/auto.master。
/etc/auto.master定义了mount目录和mount所需的配置文件名及其空闲时自动umount的时间。下面是默认配置:
[jephe@sh3 /etc]$ more auto.master
/misc /etc/auto.misc --timeout 60
下面是我的/etc/auto.misc配置文件:
[jephe@sh3 /etc]$ more auto.misc
cdrom -fstype=iso9660,ro :/dev/cdrom
floppy -fstype=vfat :/dev/fd0
e2floppy -fstype=ext2 :/dev/fd0
注:
a.确保/dev/cdrom作为符号链接指向你的光驱所在的分区,作为我的情况:
[jephe@sh3 /dev]$ ls cdrom -l
lrwxrwxrwx 1 root root 3 Aug 26 08:44 cdrom -> hdd
b.当软盘为windows 95格化化的vfat分区类型时,设定了安装目录/misc/floppy
c.当软盘为Linux格式化过的ext2分区类型时,设定了安装目录/misc/e2floppy
至此,若还未启动autofs,则运行/etc/rc.d/init.d/autofs start, 若对上述两个文件中做过任何更改,运行/etc/rc.d/init.d/autofs restart即可。
放入一片光盘进入光驱后,不需任何动作,直接进入目录/misc/cdrom,autofs 将自动先为你mount光驱同样,若放入一张vfat格式的软盘,你可以cd /misc/floppy,若是ext2格式的软盘,则cd /misc/e2floppy。在超过一分钟未使用它们,且当前目录不是自动mount目录/misc/cdrom,/misc/floppy, /misc/e2floppy,系统将自动umount它们。
cron 计划任务
====================================
简介
crontab-操作每个用户的守护程序和该执行的时间表。
部分参数说明
crontab file [-u user]-用指定的文件替代目前的crontab。
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir- 指定crontab的目录。
crontab文件的格式:M H D m d cmd.
M: 分钟(0-59)。
H:小时(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)。
cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量。
下面是一个例子文件:
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点10分
10 6 * * * date
#每两个小时
0 */2 * * * date
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
#1月份日早上4点
0 4 1 jan * date
范例
$crontab -l 列出用户目前的crontab.
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
10 6 * * * date
0 */2 * * * date
0 23-7/2,8 * * * date
如何在Linux里面恢复mbr?
====================================
  可以使用下面的命令来恢复:
  dd if=/boot/boot.NNNN of=/dev/hda bs=446 count=1
  其中bs(buffer size)是指重写的字节数。为什么不是512呢?主引导扇区是一个扇区(512字节)呀?答案是因为我们用上面的命令是为了修复可能被病毒修改了的主引导记录MBR,或者想把LILO卸载掉,而不是恢复整个主引导扇区。所以我们只把主引导扇区的备份文件boot.NNNN的前446个字节重写入主引导扇区。boot.NNNN是我们在安装Linux之前整个主引导分区的备份。如果我们把512个字节全部写入主引导扇区就可能会把安装了Linux后改变了的硬盘DPT表也**掉。那就坏事了。
如何列出一个目录占用的空间
====================================
du或du -s或du -k
du -S | sort -n 可以迅速发现那个目录是最大的。
用df可以看到已安装的文件系统的空间大小及剩余空间大小。
quota -v查看用户的磁盘空间信息,如果你用quota限制了用户空间大小的话。
在使用less 或 more时,如何直接启动编辑器
====================================
在less或者more中打入v键,会立即启动vi编辑器,可以对文件进行编辑
如何察看你当前使用的Linux内核的版本
====================================
  可以使用uname -r来查看当前内核版本。如果使用uname -a可以查看包括内核版本,机器硬件信息、网络节点名、操作系统名字等信息
如何显示文件的类型
====================================
  用命令 file 可以使你知道某个文件究竟是ELF格式的可执行文件, 还是shell script文件或是其他的什么格式 例如:
#file startx
如何将man page转成HTML格式
====================================
  使用 man2html 这个指令,就可以将 man page 转成 HTML 格式了。用法是:
  man2html filename > htmlfile.html
  例子:
  man2html /usr/man/man1/man2html.1 > ~/man2html.html
查看文件内容的特殊方法
====================================
相信最基本的cat和less你已经很熟悉了,如果有特殊的要求呢:
如果你只想看文件的前5行,可以使用head命令,如:
head -5 /etc/passwd
如果你想查看文件的后10行,可以使用tail命令,如:
tail -10 /etc/passwd
tail -f /var/log/messages
参数-f使tail不停地去读最新的内容,这样有实时监视的效果,当你在ppp拨号的过程中用它岂不是很方便!
查看文件中间一段,你可以使用sed命令,如:
sed -n '5,10p' /etc/passwd
这样你就可以只查看文件的第5行到第10行。
linux下文件分割与合并
====================================
  $dd if=source of=target.1 bs=1M count=10
  $dd if=source of=target.2 bs=1M skip=10
  source被分为target.1和target.2两个文件,其中target.1为source的前10M部分;target.2为source的减去10M后的部分。
  $cat target.1 target.2 > othersource
  source与othersource是同一个文件。
RedHat下如何显示彩色目录列表
====================================
  打开/etc/bashrc, 加入如下一行:
  alias ls="ls --color"
  下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:
蓝色-->目录
绿色-->可执行文件
红色-->压缩文件
浅蓝色-->链接文件
灰色-->其他文件
什么是Linux 运行级?
====================================
  什么是运行级呢?简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1到6,具有不同的功能。这些级别在/etc/inittab文件里指定。这个文件是init程序寻找的主要文件,最先运行的服务是那些放在/etc/rc.d 目录下的文件。
  不同的运行级定义如下:(可以参考Red Hat Linux 里面的/etc/inittab)
  # 缺省的运行级,RHS 用到的级别如下:
  # 0 - 停机(千万不要把initdefault 设置为0 )
  # 1 - 单用户模式
  # 2 - 多用户,但是没有 NFS
  # 3 - 完全多用户模式
  # 4 - 没有用到
  # 5 - X11
  # 6 - 重新启动 (千万不要把initdefault 设置为6 )
  对各个运行级的详细解释:
  0 为停机,机器关闭。
  1 为单用户模式,就像Win9x 下的安全模式类似。
  2 为多用户模式,但是没有NFS 支持。
  3 为完整的多用户模式,是标准的运行级。
  4 一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
  5 就是X11,进到Xwindow系统了。
  6 为重启,运行init 6机器就会重启。
  不同的运行级有不同的用处,也应该根据自己的不同情形来设置。例如,如果丢失了root 口令,那么可以让机器启动进入单用户状态来设置。在启动后的 lilo 提示符下输入:
  init=/bin/sh rw
  就可以使机器进入运行级1 ,并把root文件系统挂为读写。他会跳过所有系统认证,让你使用passwd 程序来改变root口令,然后启动到一个新的运行级。
系统平均负载(Load average)释疑
====================================
  在Linux系统中,uptime、w、top等命令都会有系统平均负载load average的输出,那么什么是系统平均负载呢?
  系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中:
  - 它没有在等待I/O操作的结果
  - 它没有主动进入等待状态(也就是没有调用'wait')
  - 没有被停止(例如:等待终止)
  例如:
  [root@www2 init.d]# uptime
  7:51pm up 2 days, 5:43, 2 users, load average: 8.13, 5.90, 4.94
  命令输出的最后内容表示在过去的1、5、15分钟内运行队列中的平均进程数量。
  一般来说只要每个CPU的当前活动进程数不大于3那么系统的性能就是良好的,如果每个CPU的任务数大于5,那么就表示这台机器的性能有严重问题。对于上面的例子来说,假设系统有两个CPU,那么其每个CPU的当前任务数为:8.13/2=4.065。这表示该系统的性能是可以接受的。
如何以树状结构显示系统当前的任务
====================================
  运行ps时指定—forest选项,当前运行的进程将会以树状格式显示出来。比如:所有由xserver运行的程序,将会以xserver做为它们的“根”显示出来。
命令格式:
  ps afx
  其中’a’表示列出所有运行的进程;’x’列出所有的后台进程;’f’是’-forest’的缩写。输出的格式如下:
  329 ? SW 0:00 [wdm]
  342 ? R 9:57 \_ /usr/X11R6/bin/X :0 vt7 -fbbpp 16 -auth /usr/etc/
  343 ? SW 0:00 \_ [wdm]
  364 ? S 0:45 \_ /usr/bin/enlightenment
  399 ? S 0:00 \_ /usr/bin/ssh-agent sh /home/tuneup/.xse
  404 ? S 2:28 \_ gkrellm -wm
  787 ? S 0:05 \_ aterm -fg white -tr
  788 ttyp0 SW 0:00 \_ [bash]
  792 ttyp0 S 0:00 \_ vim todo
  注:另外一种得到格式化输出结果的方法是:pstree -pu
列目录时如何显示中文文件名
====================================
  我们可以使用--show-control-chars命令选项来显示。
  例如:
  $ls --show-control-chars
  如果使用的是一个比较常用的windows的分区,那么可以通过修改fstab来实现,在fstab中加入类似内容:
  /dev/hda1 /mnt/c vfat defaults,codepage=936,iocharset=cp936 0 0
  那么以后进入系统后都可以方便地使用/mnt/c访问windows的这个目录并正确显示目录名和文件名。
如何使用iso文件?
====================================
  许多Linux发行版本都有.iso的光盘镜像文件,可以用来刻录光盘。我们也可以在Linux系统下直接使用。
  #mount -t iso9660 -o loop xxxxx.iso /any/path/if/u/like
查询你的CPU等级
====================================
cat /proc/cpuinfo
如何使用户没有telnet和ftp权限
====================================
若只希望用户没telnet权限,则需要修改/etc/passwd中对应该用户的shell为/bin/true。
若只希望用户没有telnet和ftp权限,则需要修改/etc/passwd中对应该用户的shell为/bin/false。
如何连续执行一个命令
====================================
  使用watch命令,可以反复执行命令,如果和ls配合,可以达到观察某文件大小变化的效果。例如:
  $watch ls -l file.name
如何防止某个关键文件被修改
====================================
  在linux下,有些配置文件是不允许任何人包括root修改的,为了防止被误删除或修改,可以设定该文件的"不可修改位(immutable)"。
  例如:
  chattr +i /etc/fstab
  如果需要修改文件则:
  chattr -i /etc/fstab
  以后再修改文件。
linux环境下如何undelete
====================================
  先在自己的主目录下创建一个名为.trash的子目录,然后在bashrc加入以下指令:
  alias rm 'mv -f !* ~/.trash'
  alias undel 'mv ~/.trash/!* ./!*'
  alias cleantrash '/bin/rm -rf ~/.trash; mkdir ~/.trash;sync'
  alias lrm 'ls ~/.trash'
  若文档是直接用rm命令删除的,理论上 ext2 内 rm 掉的档案还是可以用 debugfs , ext2ed 救回来的.当然... 被 overwrite 掉就没救了。
如何找出磁盘中某个大小范围内的文件
====================================
  比如要查找磁盘中大于3M的文件:
  find . -size +3000k -exec ls -ld {} ;
如何快速重新执行已经执行过的命令
====================================
  使用!可以实现该功能,例如你前面执行了很多命令,现在突然想执行上一次执行的./configure命令,则只需要输入“!./con”即可而无需使用上下键来滚动查找。
  而!!则能代替前面一个命令。比如刚执行过一次ifconfig,输入“!!”则等于再执行一次ifconfig。
  而且这两个用法可以和其他命令组合,比如你刚执行过ifconfig,然后执行man !!,就等于执行man ifconfig。
当终端出现混乱时,如何让它恢复正常
====================================
  当使用stty命令而出现一些混乱或者更糟的是,使用一个程序而使终端设置完全混乱了时怎么办?要回到“现实”,试试下面的命令:
  stty sane
  如果击键变得混乱时,试着用来把命令括起来,输入的顺序是先按下CTRL再键入j键。
  ctty sane
  这个命令不会回到先前的设置,但却可以去除一些稀奇古怪的设置。而真正会出现什么设置要依赖于所使用的系统,但它至少会让你能输入字符,并见到结果。从这里开始,你可以把一些组合键设置为你所喜欢的方式。
如何将.gz文件分割为数个1.44mb
====================================
把一个文件分割到软盘:
tar cfvm /dev/fd0 file.tar.gz
把软盘上的文件合并到硬盘:
tar xvfm /dev/fd0
如何一次处理一整个目录
====================================
  Linux/UNIX 的很多常用命令如 rm , cp 等都有一个参数---- -r , 是递归的意思, 命令里加了参数 -r 就可以对目标目录及其下所有子目录进行操作,如:
  rm -rf /test (f 是 force 意为强行)
  该命令完全删除根目录下的子目录 test ,作用类似于 dos 下的 deltree ,当然使用这个命令时要特别小心。再如:
  cp -r /test /test1
  有类似 dos 下 xcopy /s 的作用。
redhat下如何允许root通过telnet登录?
====================================
方法1:/etc/securetty ( 加入 pts/0 、pts/1、...)
# echo "pts/0" >> /etc/securetty
方法2:为了在redhat linux系统中激活远程登陆,从文件/etc/pam.d/login中移去下面这一行:
auth required /lib/security/pam_security.so
将/etc/securetty这个文件改名就行啦,该文件是定义root只能在tty1~tty6的终端上登录的,详细的信息可以"man login"。
Linux正常重新启动的方法有很多种,下面介绍几种常用的重新启动方法:
====================================
Ctrl+Alt+Del
#init 6
#shutdown -r now
#reboot
为什么我的linux不允许普通用户登录?
====================================
  以root的身份登录系统,检查是不是有/etc/nologin这个文件,删除这个文件,然后再以普通用户的身份登录。相信问题已经解决。
  出现这种问题一般是因为系统在关闭的过程中意外中断了操作,如断线或者是插头被拔了之类的意外。而系统在关闭的过程中会自动的产生这个文件,以便通知用户系统正在关闭这就造成普通用户无法登录了。
  另外一种原因是系统管理员在对系统进行维护,为了维护的过程中不受其他用户的影响,需要生成这个文件来禁止其他用户登录。但很不幸系统管理维护完以后忘记删除这个文件了。
如何改变当前路径下所有目录和文件的所有权
====================================
改变所有子目录及文件的所有权
#chown -R owner[.group] *
也可以用find命令来实现:
#find . -exec chown owner[.group] {} ;
改变所有子目录及文件的属性
在你要改变属性的目录下,输入命令:
#chmod -R 777 *
就可以改变下面所有子目录及文件的属性,不过使用这个命令的时候要特别小心,要是在根目录下打入这个命令,你所有文件的属性都将改变,这就会引起很大的安全性问题。
如何快速查找文件
====================================
  查找文件可以用find,但最好是用locate,速度快,参数少。
  $locate filename
  它是在一个数据库里面查找,所以,要记得经常用updatedb命令更新数据库。一般地,在crontab中的cron.daily脚本会执行/usr/sbin/logrotate /etc/logrotate.conf命令,让机子在每天深夜更新数据库。
如何将Linux或FreeBSD复制到另一颗硬盘 ?
====================================
  Linux上的系统复制很简单,使用cp -ax将partition资料复制过去,重开机後设定lilo就可以了。
  FreeBSD也可以用cp来复制文档,但是对于复制整个文档系统并不是好方法。
  这里介绍使用dump和restore来做:
创建新的文档系统
假如你的新硬盘为ad1, 而将来的根分区将是ad1s1a, 你可以先创建文档系统:
newfs /dev/ad1s1a
mount /dev/ad1s1a /mnt
cd /mnt
复制:
dump -f- / | restore -f- -r
这是把老的根文档系统复制输出到管道,restore从管道里读数据,写入当前目录所在的文档系统。
按部就班复制其他文档系统
复制完後,也许 要修改新硬盘下的/etc/fstab,安装上新的分区,摘下老硬盘就可以了。
再补充一点,如果你要复制的是另外一台机器,可以用rsh,这样就可以通过网络把一个分区数据传送到另外一台机器,不需要NFS,不需SAMBA等就可以解决问题,而cp就很难作到了。
newfs /dev/ad1s1a
mount /dev/ad1s1a /mnt
cd /mnt
rsh -l yourname thathost 'dump -f- /' | restore -f- -r
linux怎么给一个普通用户reboot权限?
====================================
分四种情况讨论:
1.让任何人(包括根本不拥有系统帐号的人)都可以通过控制台reboot
在/etc/inittab文件中保留ca::ctrlaltdel:/sbin/shutdown -t3 -r now
这一行。这样全国人民都可以reboot你的机器,只要你把控制台交出来。
2.让所有系统用户都可以reboot
执行# > /etc/security/console.apps/reboot即可。这就在console.apps目录下生成了一个空文件,文件名就是授权的 application。以上路径是针对Mandrake系统而言的,其他系统我不清楚。不过,真正高雅的Mandraker或许根本就不会去靠 “>”来生成这个文件——他们会使用msec来进行控制的。
3.让指定的用户才可以reboot
假设我们要让用户zhizunbao拥有reboot的权限,我们靠uid/gid来完成控制:
# groupadd reboot
# cd /usr/local
# mkdir reboot
# chown root:reboot reboot/
# chmod 750 reboot/
# cd reboot
# cp /sbin/reboot .
# chmod 4755 reboot
# usermod -G reboot zhizunbao
现在,zhizunbao就可以运行/usr/local/reboot/reboot来重启动机器。
4.在一台不设普通用户的机器上启用口令验证reboot
这实际上是靠添加一个关机帐号来实现的,该帐号的shell就是加了s位的/sbin/halt,并且口令只有少数维护人员知道。我们这里采用的就是第4套方案。
怎样知道自己的机器上有哪些服务在运行
====================================
若一台机器运行有很多不需要的服务,那么被攻击者入侵的可能性就会大大加大,因此作为管理员就应该经常查看系统运行有哪些服务。
首先查看系统运行的进程
若需要查看系统当前运行的所有进程,就需要用如下命令:
# ps auxw
其中参数a表示显示系统中所有用户的的进程;u表示输出进程用户所属信息;x表示也显示没有控制台的进程;若显示行太长而被截断则可以使用f参数;
查看系统监听的服务
# netstat -ln
l表示显示当前系统监听的端口信息;n表示端口按照端口号来显示,而不转换为service文件中定义的端口名;若希望了解各个端口都是由哪些进程监听则可以使用p参数。
  若发现不需要的服务,可以使用linuxconf或ntsysv命令来关闭这些服务在系统启动时自启动,然后重新启动系统则这些服务将在运行。
有些服务是由inetd超级服务器来监控的,则需要标记/etc/inetd.conf来关闭这些服务。

查询端口对应的服务
====================================
# lsof -i :端口号
查询此端口对应的服务。
vi 中设置自动缩进
====================================
:set autoindent
:set ai
取消
:set noautoindent
:set noai
如何使linux系统对ping不反应
====================================
  在linux里,如果要想使ping 没反应也就是用来忽略icmp包。可以用:
  echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
  若想恢复就用:
  echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
如何实现多网卡bondin
====================================
  使用多块网卡虚拟成为一块网卡,具有相同的IP地址。这项技术其实在sun和cisco中已经存在,分别称为Trunking和etherchannel技术,在Linux中,这种技术称为bonding。
  因为bonding在内核2.4.x中已经包含了,只需要在编译的时候把网络设备选项中的Bonding driver support选中就可以了。
  然后,重新编译核心,重新起动计算机,执行如下命令:
  ismod bonding
  ifconfig eth0 down
  ifconfig eth1 down
  ifconfig bond0 ipaddress
  ifenslave bond0 eth0
  ifenslave bond0 eth1
  现在两块网卡已经象一块一样工作了.这样可以提高集群节点间的数据传输.
  你最好把这几句写成一个脚本,再由/etc/rc.d/rc.local调用,以便一开机就生效.
  bonding对于服务器来是个比较好的选择,在没有千兆网卡时,用两三块100兆网卡作bonding,可大大提高服务器到交换机之间的带宽.但是需要在交换机上设置连接bonding网卡的两个口子映射为同一个虚拟接口。
字符终端关掉喇叭
将/etc/inputrc中的set bell-style none 前的#去掉,或echo "set bell-style none" >> ~/.bashrc

/etc/fstab 文件说明
=======================
使用编辑器来修改 /etc/fstab (eg. vi /etc/fstab)
功能:存放文件系统与目录结构对应资料的档案
fstab 栏位说明:
第一栏(fs_spec): 实际的设备名称
第二栏(fs_file): 对应到的目录结构,挂载点
第三栏(fs_vfstype):该分区的文件系统格式,常见的有:
ext2、ext3,xfs,reiserfs,vfat(fat32),ntfs iso9660、nfs、swap
第四栏(fs_mntops): 在 mount 时的参数
第五栏(fs_freq): 在使用 dump 时是否记录,不需要则输入0
第六栏(fs_passno): 决定在开机时执行 fsck 的先后顺序
例子 :
IDE 硬盘分成两个 partition 与一个 swap,还有一台光驱跟一台软驱的情形 :  
/dev/hda1   /            ext2    defaults        1 1
/dev/hda6   swap         swap    defaults        0 0
/dev/cdrom  /mnt/cdrom   iso9660 noauto,user,ro  0 0
/dev/fd0    /mnt/floppy  ext2    noauto,owner    0 0
none        /proc        proc    defaults        0 0
none        /dev/pts     devpts  gid=5,mode=620  0 0
/dev/hda2 /mnt/wind  vfat defaults,iocharset=cp936,umask=000 0 0
为现有系统做启动盘
====================================
# mkbootdisk --device /dev/fd0 `uname -r`
如何去掉nvidia显卡启动时的logo画面
=======================================
在/etc/X11/XF86Config文件
Driver "nvidia" 那节,加入
Option “NoLogo”
让wget 自动走代理下载
=======================================
在用户主目录下建立.wgetrc 文件,格式举例如下
http-proxy=205.155.212.11:80
ftp-proxy=205.155.212.11:80
修改mozilla,mozilla firefox系列浏览器隐藏参数
=======================================
在地址栏输入 about:config
[img]http://www.linuxsky.net/images/snapshot5.png[/img:d3fd803243]
adsl共享上网,由adsl做网关然后nat
[code:d3fd803243]echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE[/code:d3fd803243]
如何使新用户首次登陆后强制修改密码(猫小)
================================
#useradd -p '' testuser; chage -d 0 testuser

日志维护工具logrotate(hotbox)
================================
在/etc/logrotate.conf中配置,作用:定义log文件达到预定的大小或时间时,自动压缩log文件


让vi不响铃(sakulagi)


用tar 来备份恢复linux系统举例
===============================================
tar -cjpvf /mnt/wind/linux.tar.bz2 / --exclude=/mnt
tar -**vf /mnt/wind/linux.tar.bz2 -C /

adsl 拨号成功后无法上网
===============================================
/sbin/route add default ppp0


如何在RED Hat Linux 防一用户两个人用登陆
===================================
直接在shell里面,就是你的命令行下面输入
echo "* hard maxlogins 2" &gt;&gt; /etc/security/limits.conf
然后回车,这个命令会将内容
* hard maxlogins 2
写到文件/etc/security/limits.conf中

还要防终端呀,那就继续
echo "session required pam_limits.so" &gt;&gt; /etc/pam.d/login

KDM 允许root登录
==================================
修改 /etc/kde3/kdm/kdmrc
找到
AllowRootLogin=false
修改为
AllowRootLogin=true


从rpm文件中解出某个文件的三种方法
==============================================
Peck Dickens的两种方法

1) 使用Midnight Commander (mc), 翻看rpm内部文件,并将某文件拷贝出来

2) 命令行方式
cd /tmp
md rpmtmp
cd rpmtmp
rpm2cpio {FullNameOfRPM} | cpio -iumd
注意,完成后请删除临时文件

Pam Roberts的一种方法

3) 使用rpm-utils-1.5-1.noarch.rpm中的rpm-get命令,该rpm可以从rpmfind.net获取

在vi 中查找一个词组后,取消对查字符的长期高亮
===================================================
临时取消,命令“ :noh ”
永久取消,编辑 ~/.exrc ,加入新的配置命令 "set nohlsearch"
ps 有趣的办法:搜寻一个很长的手指随机词组, /asdfakjsdyhfajhf .


1:HOST的乐趣: Host能够用来查询域名,然而它可以得到更多的信息。host -t mx linux.com可以查询出Linux.com的MX记录,以及处理Mail的Host的名字。Host -l linux.com会返回所有注册在linux.com下的域名。host -a linux.com则会显示这个主机的所有域名信息。

2:找到命令需要的文件,也许你希望搞清楚一个命令它到底使用到了什么其他相关文件和命令?试试ldd就可以了。如ldd traceroute,返回结果会是libc.so.6,lid-linux.so.2

3:定时!定时!你希望定时处理吗?你肯定希望能够让你轻松一些!crontab可以听候您的指示。命令行中输入:crontab -e这进入文本编辑器,再在其中输入0 5 * * * wget -t3 -I/home/tom/URLs -N。这样每天早上5点就会运行这个wget命令。前五个是时间参数:分 时 日 月 星期几。你可以 0 5 * * 6,0 command line here,这样就在每个星期六和星期天5am运行。你需要man 5 crontab来得到更为详细的解释。随便说一下,wget是一个取web页面的小程序。 console顶部显示现在时间:在/etc/bashrc或~/.bashrc中加入环境变量PROMPT_COMMAND。export PROMPT_COMMAND='echo -ne "33733[2;999r33[1;1H33[00;44m33[K"`date`"33[00m338"'  

4:使用多达23个的虚拟终端(VT),假设你现在有6个,仿照/etc/inittab种的文件,加入
8:234:respawn:/sbin/getty 38400 tty8
24:234:respawn:/sbin/getty 38400 tty24
要跳过VT7,因为X使用这个终端。然后telinit q以重新加载配置文件。使用左Alt+Fn在1-6和8-12件切换,使用右Alt+Fn键在13-24之间切换。

5:Console切换:左Alt-方向键,循环切换console。效果和Alt+Fn一样。

6:简单的进行Dos转Unix:如果你的文本文件中每行结尾都有讨厌的Ctrl-M的话,使用这句命令能够快速的解决问题 sed 's/^M//' filename > newfilename

7:快速建立MP3播放列表:find /mnt/cdrom -name *.mp3 -print >> cd1.play.list.这样就会把CDRom中的所有MP3文件建立一个名为cd1.play.list的文件。然后使用xmms 或 x11amp就能进行播放了。

8:/proc中的重要信息
cat /proc/cpuinfo - CPU (i.e. vendor, Mhz, flags like mmx)
cat /proc/interrupts - 中断
cat /proc/ioports - 设备IO端口
cat /proc/meminfo - 内存信息(i.e. mem used, free, swap size)
cat /proc/partitions - 所有设备的所有分区
cat /proc/pci - PCI设备的信息
cat /proc/swaps - 所有Swap分区的信息
cat /proc/version - Linux的版本号

9:真正的Console界面:说实话无论是KDE和GNome我都没什么喜欢的,毕竟受Windows熏陶了这么长时间了。但是在 Console下其实才是真正的Cool界面。使用SVGATextMode可以让你的命令行界面达到132x60(标准是80x25)。我的486 (Trident9440)上使用的是132x43,那密密麻麻的字符真象Hollywood的几年前的电影(现在连电影里都是Windows了)给人感觉神秘兮兮的。配置文件在/etc/TextConfig中,不过如果你的XWindow都无法正常显示的话,那估计这也用不了了(毕竟是好几年前的东西了)。

10:让你的硬盘飞起来: Linux下也可以使用32Bit I/O和DMA。使用/sbin/hdparm -c1 /dev/hda(hdb,hdc..)打开32Bit传输模式,使用命令 /sbin/hdparm -d1 /dev/hda(hdb,hdc...) 打开DMA。最后使用/sbin/hdparm -k1 /dev/hda 以使硬盘在Reset之后保持上面的设定,这么一来,硬盘读写速度应该可以提高一倍以上。

11:微调你的Ext2: Linux下的命令tune2fs可以设定最大Mount次数(因为Linux即时在mounted clean状况下,达到一定的mount次数后,会强制e2fsck对于我这样的每天开关机的来说很不方便),tune2fs命令的其他用途请参见 man。

12:禁止在Netscape中显示闪烁(Blink)Tag: ~/.Xdefaults中修改 Netscape*blinkingEnabled: False 之后运行 xrdb -Load ~/.Xdefaults

13:随时改变XTerm的字体大小:shift加+/-

14:Ext2的文件属性: lsattr列出属性,chattr可以改变属性。如 chattr +A filename 则系统不会修改其last access time属性;chattr +i 则可以避免被rm掉。

15:SIS6326显卡的配置:在Device中加入:DacSpeed 110 Option "no_bitblt" Option "sw_cursor"

16:使用strings可以把字符串从Binary文件中分离出来

17:你大概已经习惯了使用Top来观察系统使用情况,那就使一使使用Vmstat 1来看看cpu的空闲程度(显示结果的最后一项)。

18:使用Watch命令,反复执行特定命令,如"watch ls -l /tmp/blah",将一直观察文件的大小改变。

19:使用pppstats得到ppp连接的数据。

20:显示远程机器的NFS: showmount -e hostname

21:使用autofs免去你每次mount和umount之苦,再RedHat6.0中带了autofs的rpm,只要安装好之后便可以享受自动加载文件系统的方便。在/misc目录下,创建一个cd目录,如果使用其自带的auto.misc和auto.master的话,马上就可以实现自动加载功能了。

22:在Bash Shell中,可以用!重复上几次输入过的命令,这样就可以省去往上滚动的麻烦了。使用ctl+R可以互动的检索以前使用过的命令行。

23:使用cd -在上两个cd /directory/操作中切换。如先是cd /home/foo接着是 cd /home/maison则接着打cd - 会进入 /home/foo再打cd - 会进入 /home/maison。

24:Bash中的快捷键:ESCAPE-B 会向前条一个单词,Ctrl-K会删除从光标到行末所有字符。

25:在PS命令中使用grep,例:ps auxw | grep gpm 会列出所有含有gpm字符的进程。

26:在同一个命令行上同时执行多条命令:用分号分隔。如编译一个源文件:type ./configure ; make ; make install 。之后你就可以去散步了(不要在电脑前花费了太多时间了,生活中还有很多美好的东西。)

27:把运行结果输出到一个文件中,如 ls -l > foo.file。

28:使用Top命令监视系统状况,内存使用情况,开机时间,进程状况,每个用户的使用情况等等。使用S命令可以改变其刷新的时间:如.5将会使其每半秒钟更新一次。

29:同时Unzip多个文件,unzip *不正确,而是unzip "*"。

30:建立符号连结,这大概是最有用的功能了,ln -s real-file symbolic-file,无论是设备,文档还是脚本程序。

31:改变显示的单位,如du -hm 将以M为单位输出结果,同样的du -hk则以K为单位输出。

32:自动Logoff,在~/.bashrc中加入这么一句话:TMOUT=300则会在5分钟之后logoff,不过如果less这类程序运行则不会启动。

33:在使用less 或 more时,直接启动编辑器:在less中打入v键,会立即启动vi或其他你在环境变量中指明的编辑器,但是more只能使用vi

论坛徽章:
3
天秤座
日期:2013-12-27 13:44:58射手座
日期:2014-05-22 16:52:43天蝎座
日期:2014-08-13 16:03:21
44 [报告]
发表于 2014-05-24 00:13 |只看该作者
windows&linux环境设置相关  一、CC使用技巧

1、显示某一天的更新记录:

cleartool lsthis -r -since 日期(如30-Jul)

2、查找本地所有private文件

cleartool ls -r -view_only



二、网络相关

1、nslookup ip

2、nbtstat -a  ip/主机名 通过ip/主机名,看主机名/IP

3、net share 查看共享文件夹



三、putty登陆linux服务器中文乱码

设置成功后,需要重新登陆putty

vi ~/.bashrc

文件末尾添加:
let &termencoding=&encoding
set fileencodings=utf-8,gbk,utf-16,big5

设置成功后,需要重新登陆putty



四、设置vim显示行号、语法高亮、自动缩进

set nu

set autoindent

set cindent

五、VIM Tutorial



六、linux常用命令

1、统计文件夹

统计总数大小

du -sh /var/html/wwwdu -sm * | sort -n //统计当前目录大小 并安大小 排序du -sk * | sort -ndu -sk * | grep guojf //看一个人的大小du -m | cut -d "/" -f 2 //看第二个/ 字符前的文字
查看此文件夹有多少文件 /*/*/* 有多少文件

du xmldb/du xmldb/*/*/* |wc -l2、添加linux用户

    1)  sudo adduser 用户名

    2)  sudo usermod -G 用户名群组

    3)  sudo smbpasswd -a w54542 #添加用户

    4)  sudo smbpasswd -e w54542 #激活用户
Linux进程管理命令详解  图4-8第二行代码中,USER表示启动进程用户。PID表示进程标志号。%CPU表示运行该进程占用CPU的时间与该进程总的运行时间的比例。%MEM表示该进程占用内存和总内存的比例。VSZ表示占用的虚拟内存大小,以KB为单位。RSS为进程占用的物理内存值,以KB为单位。TTY表示该进程建立时所对应的终端,"?"表示该进程不占用终端。STAT表示进程的运行状态,包括以下几种代码:D,不可中断的睡眠;R,就绪(在可运行队列中);S,睡眠;T,被跟踪或停止;Z,终止(僵死)的进程,Z不存在,但暂时无法消除;W,没有足够的内存分页可分配;<高优先序的进程;N,低优先序的进程;L,有内存分页分配并锁在内存体内(实时系统或I/O)。START为进程开始时间。TIME为执行的时间。COMMAND是对应的命令名。

  
(点击查看大图)图4-8  ps-aux命令详解

应用实例如下。

在进行系统维护时,如果CPU负载突然增加,而又不知道是哪一个进程造成的情况。使用命令:

#ps aux | sort +3n

说明  因为%CPU选项在第三列,所以sort选3作为参数,+表示升序输出结果。

8.pstree命令

pstree命令列出当前的进程,以及它们的树状结构。

格式:pstree [选项] [pid|user]

主要选项如下。

-a:显示执行程序的命令与完整参数。

-c:取消同名程序,合并显示。

-h:对输出结果进行处理,高亮显示正在执行的程序。

-l:长格式显示。

-n:以PID大小排序。

-p:显示PID。

-u:显示UID信息。

-G:使用VT100终端编码显示。

-U:使用UTF-8(Unicode)编码显示。

说明:使用ps命令得到的数据精确,但数据庞大,这一点对掌握系统整体概况来说是不容易的。pstree正好可以弥补这个缺憾。它能将当前的执行程序以树状结构显示。pstree支持指定特定程序(PID)或使用者(USER)作为显示的起始。

应用实例如下。

进程启动的时候可能会产生自己的一个子进程。运行pstree命令就可以很容易地看到这些信息。以超级用户权限运行pstree:

#init-+-apmd
|-atd
|-bdflush
|-gconfd-2
|-gdm-binary---gdm-binary-+-X
|                         `-startkde-+-kwrapper
|                                    `-ssh-agent
|-gpm
|-httpd---8*[httpd]
……下略

命令对程序名称相同的会自动合并,所有"|-httpd---8*[httpd]"即表示系统中有8个httpd进程产生的子进程。

9.top命令显示进程

top命令用来显示系统当前的进程状况。

格式:top [选项]

主要选项如下。

d:指定更新的间隔,以秒计算。

q:没有任何延迟的更新。如果使用者有超级用户,则top命令将会以最高的优先序执行。

c:显示进程完整的路径与名称。

S:累积模式,会将已完成或消失的子进程的CPU时间累积起来。

s:安全模式。

i:不显示任何闲置(Idle)或无用(Zombie)的进程。

n:显示更新的次数,完成后将会退出top。

说明:top命令和ps命令的基本作用是相同的,都显示系统当前的进程状况。但是top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态。这里结合图4-9来说明它给出的信息。


  
(点击查看大图)图4-9  top命令详解


在图4-9中,第一行表示的项目依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。第二行显示的是所有启动的、目前运行的、挂起(Sleeping)的和无用(Zombie)的进程。第三行显示的是目前CPU的使用情况,包括系统占用的比例、用户使用比例、闲置(Idle)比例。第四行显示物理内存的使用情况,包括总的可以使用的内存、已用内存、空闲内存、缓冲区占用的内存。第五行显示交换分区的使用情况,包括总的交换分区、使用的、空闲的和用于高速缓存的交换分区。第六行显示的项目最多,下面列出了详细解释。

PID(Process ID):进程标志号,是非零正整数。USER:进程所有者的用户名。PR:进程的优先级别。NI:进程的优先级别数值。VIRT:进程占用的虚拟内存值。RES:进程占用的物理内存值。SHR:进程使用的共享内存值。STAT:进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。%CPU:该进程占用的CPU使用率。%MEM:该进程占用的物理内存和总内存的百分比。TIME:该进程启动后占用的总的CPU时间。COMMAND:进程启动的启动命令名称,如果这一行显示不下,进程会有一个完整的命令行。top命令使用过程中,还可以使用一些交互的命令来完成其他参数的功能。这些命令是通过快捷键启动的。

<空格>:立刻刷新。

P:根据CPU使用大小进行排序。

T:根据时间、累计时间排序。

q:退出top命令。

m:切换显示内存信息。

t:切换显示进程和CPU状态信息。

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

M:根据使用内存大小进行排序。

W:将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

可以看到,top命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要。但是,它的缺点是会消耗很多系统资源。

http://book.51cto.com/art/200902/111563.htm

论坛徽章:
3
天秤座
日期:2013-12-27 13:44:58射手座
日期:2014-05-22 16:52:43天蝎座
日期:2014-08-13 16:03:21
45 [报告]
发表于 2014-05-24 00:15 |只看该作者
改变Linux字体和背景颜色  使用Linux的朋友一定熟悉文本界面上的黑底白字和X上的白底黑字,这两种颜色可以说是经典的搭配,清晰明了。但是你也可以根据自己的喜好使字体和背景换个颜色。
下面我介绍一下RedHat的字体和背景颜色的改变方法:
命令:
PS1="[\e[32;1m\u@\h \W]\\$" 看看是什么效果

export PS1="[\e[32;1m\u@\h \W]\\$" 两者的区别请查看环境变量的相关资料
解释:
PS1:一个环境变量,就称它为提示符变量吧,注意大小写,且后面是数字“1”
不是字母“I”
\e[32;1m:这就是控制字体和背景颜色的转义字符,30~37是字体颜色、40~47是背景颜色

子中的32;1m数字的位置是可以对调的如\e[1;32m,如果是在X环境下可以更换一下1的范围0~10,可能有的没用处:0或者不写(\e[0;
32m或\e[;32m)显示浅颜色,1:显示高亮
4:加下划线.....如果改后的效果不好,但是又还原不了,那就不写m前面的数字,如\e[32;m,或者直接注销再登陆
\u \h \W:这是一些转义字符,下面详细解释:
\d :代表日期,格式为weekday month date,例如:"Mon Aug 1"
\H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
\h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
\t :显示时间为24小时格式,如:HH:MM:SS
\T :显示时间为12小时格式
\A :显示时间为24小时格式:HH:MM
\u :当前用户的账号名称
\v :BASH的版本信息
\w :完整的工作目录名称。家目录会以 ~代替
\W :利用basename取得工作目录名称,所以只会列出最后一个目录
\# :下达的第几个命令
\$ :提示字符,如果是root时,提示符为:# ,普通用户则为:$
\n :新建一行
字体并不局限于一个颜色,可以有多个颜色:
PS1="[\e[32;1m\u@\e[35;1m\h \e[31;1m\W]\\$"
以上两个命令在注销后再登陆就失效了,用下面方法使其永久生效:
vi /etc/profile
在“export PATH .....”下面添加一行:export PS1="[\e[32;1m\u@\h \W]\\$"
注销再登陆,就成功了,如果没生效,使用source /etc/profile 命令试试,或者直接重启机器。
-e     enable interpretation of the backslash-escaped characters listed below
字背景颜色范围:40----49
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色
字颜色:30-----------39
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色
===============================================ANSI控制码的说明
\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m -- \33[37m 设置前景色
\33[40m -- \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标
例子
echo -e "\033[41;36m hello world \033[0m"
其中41的位置代表底色, 36的位置是代表字的颜色




在linux用户层程序,串口打印输出不同颜色字体的方法:

#define PRINT_RED(s)    printf("\033[0;31m%s\033[0;39m",s);
#define PRINT_GREEN(s)    printf("\033[0;32m%s\033[0;39m",s);
#define PRINT_YELLOW(s)    printf("\033[0;33m%s\033[0;39m",s);
#define PRINT_BULE(s)    printf("\033[0;34m%s\033[0;39m",s);
#define PRINT_PURPLE(s)    printf("\033[0;35m%s\033[0;39m",s);/*紫色*/

先举个例子:
以红色在终端上打印出“Hello, world”,对应的代码如下:
printf("\033[31m\033[1m"; // 开始以红色打印
printf("Hello, world\n";

要恢复默认颜色打印,只需要再打印如下一句:
printf("\033[0m";


从上面的例子可以看出printf("\033[31m\033[1m"; 和printf("\033[0m";是成对的。
Linux环境下的C/C++基础调试技术1  Author:gnuhpc
WebSite:blog.csdn.net/gnuhpc

1.调试技术的几个准则

•惊喜准则:找到错误是一种惊喜,心理上不要畏惧而是要怀着感恩的心去面对。
•从小处开始准则:刚开始测试的使用从小处着手,暂时不涉及边界数据,虽然这样可能会掩盖一些Bug,但是这样或许能查到最主要的Bug,例如你的程序包含了一个巨大的循环体,最容易发现的Bug在第一个循环或第二次循环执行的时候。
•自顶向下准则:优先选择step over而不是step into,以节省时间。
•Segmentation Fault准则:出现段错误时,第一个想到的不应该是printf而是Debugger,因为在调试器中你能看到你的哪一行代码导致了错误,更重要的是你可以通过backtrace等工具得到更多有用的信息。
•折半查找准则:在寻找bug时可以充分利用编辑器等工具来进行折半查找,具体在后边有例子说明。
2.Linux下代码调试工具

主要使用的GDB,以及基于GDB的图形化工具,如DDD或eclipse,选择上看个人习惯了。

命令行式的GDB启动较快,可以在ssh终端下使用,操作简洁,并且在调试GUI程序时不会崩溃,但较之图形化则在单步调试或设置断点时非常不方便。

当然你可以使用Vim等编辑器的插件或者补丁(clewn or vimGDB)来弥补这一缺憾,并且在GDB6.1以上的版本你可以使用GDB -tui这个模式(或者在GDB的命令行模式下按CTRL-x-a)打开一个类似于图形界面的文本界面模式,在这个界面中你可以使用上下键查看源代码(CTRL-P 和 CTRL-N完成输入过的命令的查看).

或者你还可以使用cGDB这个工具(很庆幸这个项目在停止了三年后又有人开始维护了),这个工具是将GDB用curses包装了一下,提供了一些很好用的feature(Esc和i键在代码和命令框间切换;在代码框中支持vim型的操作;在命令框中支持tab键补全命令;在移动到想加入断点的行(行号为高亮白色)直接用空格键,设定好后行号会变红;)。另外,在调试C-S程序时推荐使用eclipse。

在本文中,重点介绍ddd的操作,因为这个工具即结合了GDB命令行和图形界面的操作。其余请参阅各个工具的手册。

3.GDB命令行最基本操作

•设置断点:b LineNumber
•运行程序:r args1 args2 ...
•彻底终止程序:kill
•单步执行:n(TIPs1:可以按回车重复上一次操作,在单步调试时这个feature很有用)。
•单步进入:s
•继续执行:c
•设置临时断点:tb LineNumber 可以理解为一次性断点,与断点不同,临时断点只在第一次执行时起作用。
•查看变量:p
•设置观察点:
•w Expression,当Expression是一个变量名时,这个变量变化时会停止执行;你也可以使用条件来限定,比如w (z>2,当z大于28时,程序停止。注意观察点一般使用在更大范围上的变量,而不是本地变量,因为在局部变量上设置的观察点在局部结束时(比如该变量所在的函数执行结束时)就被取消了。
•当然这并不包含main的情况,因为main函数执行结束后程序就结束了。
•查看栈帧:
•栈帧指的是在一个函数调用时,该函数调用的运行信息(包含本地变量、参数以及函数被调用的位置)存储的地方。每当一个函数被调用时,一个新的帧就被系统压入一个由系统维护的帧,在这个栈的顶端是现在正在运行的函数信息,当该函数调用结束时被弹出并析构。
•在GDB中,frame 0为当前帧,frame 1为当前帧的父帧,frame 2为父帧的父帧,等等,用down命令则是反向的。这是一个很有用的信息,因为在早期的一些帧中的信息可能会给你一些提示。
•backtrace查看整个帧栈
•注意:在帧中来回并不影响程序的执行。
实例:插入排序算法调试

用伪代码描述这个过程如下:



拟调试代码如下:

//
//
// be sorted
// workspace array  
// current number of elements in y
int i;
   for (i = 0; i < num_inputs; i++)
}
int k;
void insert(int new_y)
if (num_y = 0)  { // y empty so far, easy case
      return;
   // need to insert just before the first y
for (j = 0; j < num_y; j++)  {
// shift y[j], y[j+1],... rightward
return;
   }
void process_data()
   for (num_y = 0; num_y < num_inputs; num_y++)
// among y[0],...,y[num_y-1]
}
int i;
%d\n",y[i]);
int main(int argc, char ** argv)
   process_data();
}我们编译一下:

gcc -g -Wall -o insert_sort ins.c

注意我们要使用-g选项告诉编译器在可执行文件中保存符号表——我们程序中变量和代码对应的内存地址。

现在我们开始运行一下,我们使用“从小处开始准则”,首先使用两个数进行测试:

./insert_sort 12 5

我们发现该程序没有退出,貌似进入了一个死循环。我们开始使用ddd调试这个程序:

ddd insert_sort

运行程序,传入两个参数:

r 12 5

此时程序一直运行不退出,按Ctrl+C暂停程序的执行

(GDB) r 12 5
^C
Program received signal SIGINT, Interrupt.
0x080484ff in insert (new_y=3) at insert_sort.c:45
/home/gnuhpc/MyCode/Debug/Chapter_01/insert_sort/pg_019/insert_sort.c:45:939:beg:0x80484ff
(GDB)



我们可以看到程序停止在第49行。我们看一下num_y现在的值:

(GDB) p num_y
$1 = 1

这里的$1指的是你要GDB告诉你的第一个变量。找到了这个地方后,我们看看在num_y=1时都发生了什么,我们在insert函数(第27行)设置断点(你也可以直接使用break insert在这个函数的入口设置断点),并且设置GDB在断点1处(你可以通过info break命令查看断点)只当num_y==1时才停止:

(GDB) b 27
Breakpoint 1 at 0x80484a1: file insert_sort.c, line 27.
(GDB) condition 1 num_y==1
(GDB) 

上述命令也可以使用break if合一:

(GDB) break 27 if num_y==1

然后再运行程序,随后用n单步调试发现我们跳到了该函数的出口处:



此时我们看看num_y的值,以便查看到底这个for循环执行的情况。

(GDB) p num_y
$2 = 0

此时的情况是我们进入这个函数时num_y为1,但是现在num_y为0,在中间这个变量被改变了。现在你知道Bug就在30-36行间。同时,通过单步调试你发现31-33行被跳过了,34、35行为注释,那么Bug就在第30或第36行间了。

我们现在仔细看这两行就能得出结论了:30行有个典型的if判断条件写成赋值的错误,致命的是这个变量是全局变量,直接导致49行的for循环变量一直被重置。我们修改后重新编译(可以另开一个编辑器,不用退出ddd),然后再运行

(GDB) r 12 5
5
0

虽然没有了死循环,但是结果还是不对的。

请注意,初始的时候数组y是空的,在#49进行第一次循环时,y[0]应该为12,在第二个循环中,程序应该挪动12为5腾出位置插入,但是此时这个结果看上去是5取代了12。

此时单步调试进入for循环,#37看y[0]的值,的确是12。我们执行到scoot_over函数时,根据自顶向下准则我们单步跳过,继续执行到#41,看看结果对错再决定是不是要单步进入scoot_over函数:



我们发现12根本就没有被移动,说明scoot_over函数有问题,我们去掉insert函数入口的断点,在scoot_over入口处设置断点,当num_y=1的时候终止:b scoot_over if num_y==1。进一步单步调试后发现这个#23的for循环就没有执行。

(GDB) p jj
$12 = 0
(GDB) p k
$13 = 0

我们看到是因为没有满足for循环条件而不能进入循环。在这里12应该从y[0]移动到y[1],那么我们确定是循环的初始化错误,应该为k = num_y,将这个地方修改后编译运行,程序出现段错误。我们清空所有的断点,然后在

(GDB) r

Program received signal SIGSEGV, Segmentation fault.
0x08048483 in scoot_over (jj=0) at insert_sort.c:24
(GDB)

这里指出在24行出现seg fault,那么要么k超过了数组界限,要么k-1为负的。打印一下k的值,我们就发现:

(GDB) p k
$14 = 992
(GDB)

远远超过k应该有的值。查看num_y 为1,说明在处理第二个要排序的数时出错,再打印jj值,发现为0,就发现我们的for循环k++应该改为k—。

编译运行,发现ok。但是运行多个数据就又出错了:

(GDB) r 12 5 19 22 6 1
1
5
6
12
0
0

Program exited with code 06.
(GDB)

我们看到结果中从19开始的排序都有问题,我们在for (j = 0; j < num_y; j++)  这一行行设置断点,条件为new_y==19的时候:

(GDB) break 36 if new_y==19
Breakpoint 10 at 0x80484b1: file insert_sort.c, line 36.
(GDB)

单步调试就发现我们没有对当要插入的元素大于所有元素时进行处理。在#44后加入y[num_y] = new_y;重新编译,运行程序正确,至此,我们通过一个简单的例子演示了一下如何使用GDB进行调试。

参考文献:
《Art of Debugging》
《Linux&reg; Debugging and Performance Tuning: Tips and Techniques》

Author:gnuhpc
WebSite:blog.csdn.net/gnuhpc

论坛徽章:
3
天秤座
日期:2013-12-27 13:44:58射手座
日期:2014-05-22 16:52:43天蝎座
日期:2014-08-13 16:03:21
46 [报告]
发表于 2014-05-24 00:16 |只看该作者
Linux中top对应Solaris的prstat,Windows的tasklist或任务管理器。

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.

1.命令格式:

top [参数]

2.命令功能:

显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等

3.命令参数:

-b 批处理

-c 显示完整的治命令

-I 忽略失效过程

-s 保密模式

-S 累积模式

-i<时间> 设置间隔时间

-u<用户名> 指定用户名

-p<进程号> 指定进程

-n<次数> 循环显示的次数


4.使用实例:

实例1:显示进程信息

命令:

top

输出:

[root@TG1704 log]# top

top - 14:06:23 up 70 days, 16:44,  2 users,  load average: 1.25, 1.32, 1.35

Tasks: 206 total,   1 running, 205 sleeping,   0 stopped,   0 zombie

Cpu(s):  5.9%us,  3.4%sy,  0.0%ni, 90.4%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st

Mem:  32949016k total, 14411180k used, 18537836k free,   169884k buffers

Swap: 32764556k total,        0k used, 32764556k free,  3612636k cached


  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                               

28894 root      22   0 1501m 405m  10m S 52.2  1.3   2534:16 java                                                                  

18249 root      18   0 3201m 1.9g  11m S 35.9  6.0 569:39.41 java                                                                  

2808 root      25   0 3333m 1.0g  11m S 24.3  3.1 526:51.85 java                                                                  

25668 root      23   0 3180m 704m  11m S 14.0  2.2 360:44.53 java                                                                  

  574 root      25   0 3168m 611m  10m S 12.6  1.9 556:59.63 java                                                                  

1599 root      20   0 3237m 1.9g  11m S 12.3  6.2 262:01.14 java                                                                  

1008 root      21   0 3147m 842m  10m S  0.3  2.6   4:31.08 java                                                                  

13823 root      23   0 3031m 2.1g  10m S  0.3  6.8 176:57.34 java                                                                  

28218 root      15   0 12760 1168  808 R  0.3  0.0   0:01.43 top                                                                    

29062 root      20   0 1241m 227m  10m S  0.3  0.7   2:07.32 java                                                                  

    1 root      15   0 10368  684  572 S  0.0  0.0   1:30.85 init                                                                  

    2 root      RT  -5     0    0    0 S  0.0  0.0   0:01.01 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      RT  -5     0    0    0 S  0.0  0.0   0:00.80 migration/1                                                            

    6 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/1                                                            

    7 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/1                                                            

    8 root      RT  -5     0    0    0 S  0.0  0.0   0:20.59 migration/2                                                            

    9 root      34  19     0    0    0 S  0.0  0.0   0:00.09 ksoftirqd/2                                                            

   10 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/2                                                            

   11 root      RT  -5     0    0    0 S  0.0  0.0   0:23.66 migration/3                                                            

   12 root      34  19     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/3                                                            

   13 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/3                                                            

   14 root      RT  -5     0    0    0 S  0.0  0.0   0:20.29 migration/4                                                            

   15 root      34  19     0    0    0 S  0.0  0.0   0:00.07 ksoftirqd/4                                                            

   16 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/4                                                            

   17 root      RT  -5     0    0    0 S  0.0  0.0   0:23.07 migration/5                                                            

   18 root      34  19     0    0    0 S  0.0  0.0   0:00.07 ksoftirqd/5                                                            

   19 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/5                                                            

   20 root      RT  -5     0    0    0 S  0.0  0.0   0:17.16 migration/6                                                            

   21 root      34  19     0    0    0 S  0.0  0.0   0:00.05 ksoftirqd/6                                                            

   22 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/6                                                            

   23 root      RT  -5     0    0    0 S  0.0  0.0   0:58.28 migration/7


说明:

统计信息区:

前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。

第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:

14:06:23 — 当前系统时间

up 70 days, 16:44 — 系统已经运行了70天16小时44分钟(在这期间系统没有重启过的吆!)

2 users — 当前有2个用户登录系统

load average: 1.15, 1.42, 1.44 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。

load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第二行,Tasks — 任务(进程),具体信息说明如下:

系统现在共有206个进程,其中处于运行中的有1个,205个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。

第三行,cpu状态信息,具体属性说明如下:

5.9%us — 用户空间占用CPU的百分比。

3.4% sy — 内核空间占用CPU的百分比。

0.0% ni — 改变过优先级的进程占用CPU的百分比

90.4% id — 空闲CPU百分比

0.0% wa — IO等待占用CPU的百分比

0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比

0.2% si — 软中断(Software Interrupts)占用CPU的百分比

备注:在这里CPU的使用比率和windows概念不同,需要理解linux系统用户空间和内核空间的相关知识!

第四行,内存状态,具体信息如下:

32949016k total — 物理内存总量(32GB)

14411180k used — 使用中的内存总量(14GB)

18537836k free — 空闲内存总量(18GB)

169884k buffers — 缓存的内存量 (169M)

第五行,swap交换分区信息,具体信息说明如下:

32764556k total — 交换区总量(32GB)

0k used — 使用的交换区总量(0K)

32764556k free — 空闲交换区总量(32GB)

3612636k cached — 缓冲的交换区总量(3.6GB)


备注:

第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。

如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:18537836k +169884k +3612636k = 22GB左右。

对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。

第六行,空行。

第七行以下:各进程(任务)的状态监控,项目列信息说明如下:

PID — 进程id

USER — 进程所有者

PR — 进程优先级

NI — nice值。负值表示高优先级,正值表示低优先级

VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

SHR — 共享内存大小,单位kb

S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程

%CPU — 上次更新到现在的CPU时间占用百分比

%MEM — 进程使用的物理内存百分比

TIME+ — 进程使用的CPU时间总计,单位1/100秒

COMMAND — 进程名称(命令名/命令行)


其他使用技巧:

1.多U多核CPU监控

在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况:



观察上图,服务器有16个逻辑CPU,实际上是4个物理CPU。再按数字键1,就会返回到top基本视图界面。

2.高亮显示当前运行进程

敲击键盘“b”(打开/关闭加亮效果),top的视图变化如下:

     

我们发现进程id为2570的“top”进程被加亮了,top进程就是视图第二行显示的唯一的运行态(runing)的那个进程,可以通过敲击“y”键关闭或打开运行态进程的加亮效果。

3.进程字段排序

默认进入top时,各进程是按照CPU的占用量来排序的,在下图中进程ID为28894的java进程排在第一(cpu占用142%),进程ID为574的java进程排在第二(cpu占用16%)。

      

    敲击键盘“x”(打开/关闭排序列的加亮效果),top的视图变化如下:

        

可以看到,top默认的排序列是“%CPU”。


4. 通过”shift + >”或”shift + <”可以向右或左改变排序列

下图是按一次”shift + >”的效果图,视图现在已经按照%MEM来排序。

         


实例2:显示 完整命令

命令:

top -c

输出:

      

说明:


实例3:以批处理模式显示程序信息

命令:

top -b

输出:

说明:


实例4:以累积模式显示程序信息

命令:

top -S

输出:

说明:


实例5:设置信息更新次数

命令:

  top -n 2

输出:

说明:

表示更新两次后终止更新显示


实例6:设置信息更新时间

命令:

top -d 3

输出:

说明:

表示更新周期为3秒


实例7:显示指定的进程信息

命令:

top -p 574

输出:




说明:

     5.top交互命令


在top 命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了s 选项, 其中一些命令可能会被屏蔽。

h 显示帮助画面,给出一些简短的命令总结说明

k 终止一个进程。

i 忽略闲置和僵死进程。这是一个开关式命令。

q 退出程序

r 重新安排一个进程的优先级别

S 切换到累计模式

s 改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s

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

o或者O 改变显示项目的顺序

l 切换显示平均负载和启动时间信息

m 切换显示内存信息

t 切换显示进程和CPU状态信息

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

M 根据驻留内存大小进行排序

P 根据CPU使用百分比大小进行排序

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

    W 将当前设置写入~/.toprc文件中
原文:
http://www.cnblogs.com/peida/archive/2012/12/24/2831353.html

论坛徽章:
3
天秤座
日期:2013-12-27 13:44:58射手座
日期:2014-05-22 16:52:43天蝎座
日期:2014-08-13 16:03:21
47 [报告]
发表于 2014-05-24 00:17 |只看该作者
修改linux提示符的显示格式  Linux系统的 bash shell 环境下通常是由 PS1 这个 bash内置变量决定主命令提示符的显示格式,我们只需要将这个变量设置成我们需要的格式就能获得我们想要的视觉效果。

比如我现在用的:PS1="\[\033[32m\]\w <\u@\h> \t\[\033[m\]  ,效果如下:





可以执行export PS1="\[\033[32m\]\w <\u@\h> \t\[\033[m\] \\$ "在当前终端生效(重新登录失效),也可以在/etc/profile中添加这行永远生效。


Linux Shell常用技巧(十二) Shell编程  二十三. Bash Shell编程:

    1.  读取用户变量:
    read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入。在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量REPLY。下面的列表给出了read命令的常用方式:

命令格式 描述
read answer 从标准输入读取输入并赋值给变量answer。
read first last 从标准输入读取输入到第一个空格或者回车,将输入的第一个单词放到变量first中,并将该行其他的输入放在变量last中。
read 从标准输入读取一行并赋值给特定变量REPLY。
read -a arrayname 把单词清单读入arrayname的数组里。
read -p prompt 打印提示,等待输入,并将输入存储在REPLY中。
read -r line 允许输入包含反斜杠。


    见下面的示例(绿色高亮部分的文本为控制台手工输入信息):
    /> read answer        #等待读取输入,直到回车后表示输入完毕,并将输入赋值给变量answer
    Hello                       #控制台输入Hello
    /> echo $answer      #打印变量
    Hello

    #等待一组输入,每个单词之间使用空格隔开,直到回车结束,并分别将单词依次赋值给这三个读入变量。
    /> read one two three
    1 2 3                      #在控制台输入1 2 3,它们之间用空格隔开。
    /> echo "one = $one, two = $two, three = $three"
    one = 1, two = 2, three = 3

    /> read                  #等待控制台输入,并将结果赋值给特定内置变量REPLY。
    This is REPLY          #在控制台输入该行。
    /> echo $REPLY      #打印输出特定内置变量REPLY,以确认是否被正确赋值。
    This is REPLY

    /> read -p "Enter your name: "    #输出"Enter your name: "文本提示,同时等待输入,并将结果赋值给REPLY。
    Enter you name: stephen            #在提示文本之后输入stephen
    /> echo $REPLY
    stephen

    #等待控制台输入,并将输入信息视为数组,赋值给数组变量friends,输入信息用空格隔开数组的每个元素
    /> read -a friends
    Tim Tom Helen
    /> echo "I have ${#friends} friends"
    I have 3 friends
    /> echo "They are ${friends[0]}, ${friends[1]} and ${friends[2]}."
    They are Tim, Tom and Helen.

   2.  状态判断:
    test是Shell中提供的内置命令,主要用于状态的检验,如果结果为0,表示成功,否则表示失败。见如下示例:
    /> name=stephen
    /> test $name != stephen
    /> echo $?
    1
    需要注意的是test命令不支持Shell中提供的各种通配符,如:
    /> test $name = [Ss]tephen
    /> echo $?
    1
    test命令还可以中括号予以替换,其语义保持不变,如:
    /> [ $name = stephen ]
    /> echo $?
    0   
    在Shell中还提供了另外一种用于状态判断的方式:[[ expr ]],和test不同的是,该方式中的表达式支持通配符,如:
    /> name=stephen
    /> [[ $name == [Ss]tephen ]]
    /> echo $?
    0
    #在[[ expression ]]中,expression可以包含&&(逻辑与)和||(逻辑或)。
    /> [[ $name == [Ss]tephen && $friend == "Jose" ]]
    /> echo $?
    1
    /> shopt -s extglob   #打开Shell的扩展匹配模式。
    /> name=Tommy
    # "[Tt]o+(m)y"的含义为,以T或t开头,后面跟着一个o,再跟着一个或者多个m,最后以一个y结尾。
    /> [[ $name == [Tt]o+(m)y ]]
    /> echo $?
    0
    在Shell中还提供了let命令的判断方式: (( expr )),该方式的expr部分,和C语言提供的表达式规则一致,如:
    /> x=2
    /> y=3
    /> (( x > 2 ))
    /> echo $?
    1
    /> (( x < 2 ))
    /> echo $?
    0  
    /> (( x == 2 && y == 3 ))
    /> echo $?
    0
    /> (( x > 2 || y < 3 ))
    /> echo $?
    1

    下面的表格是test命令支持的操作符:

判断操作符 判断为真的条件
字符串判断   
[ stringA=stringB ] stringA等于stringB
[ stringA==stringB ] stringA等于stringB
[ stringA!=stringB ] stringA不等于stringB
[ string ] string不为空
[ -z string ] string长度为0
[ -n string ] string长度不为0
逻辑判断   
[ stringA -a stringB ] stringA和stringB都是真
[ stringA -o stringB ] stringA或stringB是真
[ !string ] string不为真
逻辑判断(复合判断)   
[[ pattern1 && pattern2 ]] pattern1和pattern2都是真
[[ pattern1 || pattern2 ] pattern1或pattern2是真
[[ !pattern ]] pattern不为真
整数判断   
[ intA -eq intB ] intA等于intB
[ intA -ne intB ] intA不等于intB
[ intA -gt intB ] intA大于intB
[ intA -ge intB ] intA大于等于intB
[ intA -lt intB ] intA小于intB
[ intA -le intB ] intA小于等于intB
文件判断中的二进制操作   
[ fileA -nt fileB ] fileA比fileB新
[ fileA -ot fileB ] fileA比fileB旧
[ fileA -ef fileB ] fileA和fileB有相同的设备或者inode值
文件检验   
[ -d $file ] or [[ -d $file ]] file为目录且存在时为真
[ -e $file ] or [[ -e $file ]] file为文件且存在时为真
[ -f $file ] or [[ -f $file ]] file为非目录普通文件存在时为真
[ -s $file ] or [[ -s $file ]] file文件存在, 且长度不为0时为真
[ -L $file ] or [[ -L $file ]] file为链接符且存在时为真
[ -r $file ] or [[ -r $file ]] file文件存在且可读时为真
[ -w $file ] or [[ -w $file ]] file文件存在且可写时为真
[ -x $file ] or [[ -x $file ]] file文件存在且可执行时为真

    注:在逻辑判断(复合判读中),pattern可以包含元字符,在字符串的判断中,pattern2必须被包含在引号中。

    let命令支持的操作符和C语言中支持的操作符完全相同,如:
    +,-,*,/,%            加,减,乘,除,去模
    >>,<<                右移和左移
    >=,<=,==,!=      大于等于,小于等于,等于,不等于
    &,|,^                  按位与,或,非
    &&,||,!                逻辑与,逻辑或和取反
    还有其含义和C语言等同的快捷操作符,如=,*=,/=,%=,+=,-=,<<=,>>=,&=,|=,^=。

    3.  流程控制语句:
    if语句格式如下:
    #if语句的后面是Shell命令,如果该命令执行成功返回0,则执行then后面的命令。
    if command        
    then
        command
        command
    fi
    #用test命令测试其后面expression的结果,如果为真,则执行then后面的命令。
    if test expression
    then
        command
    fi
    #下面的格式和test expression等同
    if [ string/numeric expression ]
    then
        command
    fi
    #下面的两种格式也可以用于判断语句的条件表达式,而且它们也是目前比较常用的两种。
    if [[ string expression ]]
    then
        command
    fi

    if (( numeric expression ))           #let表达式
    then
        command
    fi
    见如下示例:
    /> cat > test1.sh                       #从命令行直接编辑test1.sh文件。
    echo -e "Are you OK(y/n)? \c"
    read answer
    #这里的$answer变量必须要用双引号扩住,否则判断将失败。当变量$answer等于y或Y时,支持下面的echo命令。
    if [ "$answer" = y -o "$answer" = Y ]   
    then
        echo "Glad to see it."
    fi
    CTRL+D  
    /> . ./test1.sh
    Are you OK(y/n)? y
    Glad to see it.
    上面的判断还可以替换为:
    /> cat > test2.sh
    echo -e "Are you OK(y/n or Maybe)? \c"
    read answer
    # [[ ]]复合命令操作符允许其中的表达式包含元字符,这里输入以y或Y开头的任意单词,或Maybe都执行then后面的echo。
    if [[ $answer == [yY]* || $answer = Maybe ]]  
    then
        echo "Glad to hear it.
    fi
    CTRL+D
    /> . ./test2.sh
    Are you OK(y/n or Maybe)? yes
    Glad to hear it.
    下面的例子将使用Shell中的扩展通配模式。
    /> shopt -s extglob        #打开该扩展模式
    /> answer="not really"
    /> if [[ $answer = [Nn]o?( way |t really) ]]
    > then
    >    echo "I am sorry."
    > fi
    I am sorry.
    对于本示例中的扩展通配符,这里需要给出一个具体的解释。[Nn]o匹配No或no,?( way|t really)则表示0个或1个( way或t really),因此answer变量匹配的字符串为No、no、Not really、not really、No way、no way。
    下面的示例使用了let命令操作符,如:
    /> cat > test3.sh
    if (( $# != 2 ))                    #等同于 [ $# -ne 2 ]
    then
        echo "Usage: $0 arg1 arg2" 1>&2
        exit 1                         #exit退出值为0-255之间,只有0表示成功。
    fi
    if (( $1 < 0 || $1 > 30 ))      #等同于 [ $1 -lt 0 -o $1 -gt 30 ]
    then
        echo "arg1 is out of range."
        exit 2
    fi
    if (( $2 <= 20 ))                  #等同于 [ $2 -le 20 ]
    then
        echo "arg2 is out of range."
    fi
    CTRL+D
    /> sh ./test3.sh
    Usage: ./test3.sh arg1 arg2
    /> echo $?                          #Shell脚本的退出值为exit的参数值。
    1
    /> sh ./test3.sh 40 30
    arg1 is out of range.
    /> echo $?
    2
    下面的示例为如何在if的条件表达式中检验空变量:
    /> cat > test4.sh
    if [ "$name" = "" ]                #双引号就表示空字符串。
    then
        echo "name is null."
    fi
    CTRL+D
    /> . ./test4.sh
    name is null.

    if/elif/else语句的使用方式和if语句极为相似,相信有编程经验的人都不会陌生,这里就不再赘述了,其格式如下:
    if command
    then
        command
    elif command
    then
        command
    else
        command
    fi
    见如下示例脚本:
    /> cat > test5.sh
    echo -e "How old are you? \c"
    read age
    if [ $age -lt 0 -o $age -gt 120 ]                #等同于 (( age < 0 || age > 120 ))
    then
        echo "You are so old."
    elif [ $age -ge 0 -a $age -le 12 ]               #等同于 (( age >= 0 && age <= 12 ))
    then
        echo "You are child."
    elif [ $age -ge 13 -a $age -le 19 ]             #等同于 (( age >= 13 && age <= 19 ))
    then
        echo "You are 13--19 years old."
    elif [ $age -ge 20 -a $age -le 29 ]             #等同于 (( age >= 20 && age <= 29 ))
    then
        echo "You are 20--29 years old."
    elif [ $age -ge 30 -a $age -le 39 ]             #等同于 (( age >= 30 && age <= 39 ))
    then
        echo "You are 30--39 years old."
    else
        echo "You are above 40."
    fi
    CTRL+D
    /> . ./test5.sh
    How old are you? 50
    You are above 40.

    case语句格式如下:
    case variable in
    value1)
        command
        ;;            #相同于C语言中case语句内的break。
    value2)
        command
        ;;
    *)                #相同于C语言中switch语句内的default
       command
        ;;
    esac
    见如下示例脚本:
    /> cat > test6.sh
    #!/bin/sh
    echo -n "Choose a color: "
    read color
    case "$color" in
    [Bb]l??)
        echo "you select blue color."
        ;;
    [Gg]ree*)
        echo "you select green color."
        ;;
    red|orange)
        echo "you select red or orange."
        ;;
    *)
        echo "you select other color."
        ;;
    esac
    echo "Out of case command."
    /> . ./test6.sh
    Choose a color: green
    you select green color.
    Out of case command.

   4.  循环语句:
    Bash Shell中主要提供了三种循环方式:for、while和until。
    for循环声明格式:
    for variable in word_list
    do
        command
    done
    见如下示例脚本:
    /> cat > test7.sh
    for score in math english physics chemist   #for将循环读取in后面的单词列表,类似于Java的for-each。
    do
        echo "score = $score"
    done
    echo "out of for loop"
    CTRL+D
    /> . ./test7.sh
    score = math
    score = english
    score = physics
    score = chemist
    out of for loop

    /> cat > mylist   #构造数据文件
    tom
    patty
    ann
    jake
    CTRL+D
    /> cat > test8.sh
    #!/bin/sh
    for person in $(cat mylist)                 #for将循环读取cat mylist命令的执行结果。
    do
        echo "person = $person"
    done
    echo "out of for loop."
    CTRL+D
    /> . ./test8.sh
    person = tom
    person = patty
    person = ann
    person = jake
    out of for loop.

    /> cat > test9.sh
    for file in test[1-8].sh                        #for将读取test1-test8,后缀为.sh的文件
    do
        if [ -f $file ]                              #判断文件在当前目录是否存在。
        then
            echo "$file exists."
        fi
    done
    CTRL+D
    /> . ./test9.sh
    test2.sh exists.
    test3.sh exists.
    test4.sh exists.
    test5.sh exists.
    test6.sh exists.
    test7.sh exists.
    test8.sh exists.

    /> cat > test10.sh
    for name in $*                                  #读取脚本的命令行参数数组,还可以写成for name的简化形式。
    do
        echo "Hi, $name"
    done
    CTRL+D
    /> . ./test10.sh stephen ann
    Hi, stephen
    Hi, ann

    while循环声明格式:
    while command  #如果command命令的执行结果为0,或条件判断为真时,执行循环体内的命令。
    do
        command
    done
    见如下示例脚本:
    /> cat > test1.sh  
    num=0
    while (( num < 10 ))               #等同于 [ $num -lt 10 ]
    do
        echo -n "$num "
        let num+=1
    done
    echo -e "\nHere's out of loop."
    CTRL+D
    /> . ./test1.sh
    0 1 2 3 4 5 6 7 8 9
    Here's out of loop.

    /> cat > test2.sh
    go=start
    echo Type q to quit.
    while [[ -n $go ]]                     #等同于[ -n "$go" ],如使用该风格,$go需要被双引号括起。
    do
        echo -n How are you.
        read word
        if [[ $word == [Qq] ]]      #等同于[ "$word" = Q -o "$word" = q ]
        then
            echo Bye.
            go=                        #将go变量的值置空。
        fi
    done
    CTRL+D
    /> . ./test2.sh
    How are you. Hi
    How are you. q
    Bye.

    until循环声明格式:
    until command                         #其判断条件和while正好相反,即command返回非0,或条件为假时执行循环体内的命令。
    do
        command
    done
    见如下示例脚本:
    /> cat > test3.sh
    until who | grep stephen           #循环体内的命令将被执行,直到stephen登录,即grep命令的返回值为0时才退出循环。
    do
        sleep 1
        echo "Stephen still doesn't login."
    done
    CTRL+D

    shift命令声明格式:shift [n]
    shift命令用来把脚本的位置参数列表向左移动指定的位数(n),如果shift没有参数,则将参数列表向左移动一位。一旦移位发生,被移出列表的参数就被永远删除了。通常在while循环中,shift用来读取列表中的参数变量。
    见如下示例脚本:
    /> set stephen ann sheryl mark #设置4个参数变量。
    /> shift                                    #向左移动参数列表一次,将stephen移出参数列表。
    /> echo $*
    ann sheryl mark
    /> shift 2                                 #继续向左移动两位,将sheryl和ann移出参数列表
    /> echo $*
    mark
    /> shift 2                                 #继续向左移动两位,由于参数列表中只有mark了,因此本次移动失败。
    /> echo $*
    mark

    /> cat > test4.sh
    while (( $# > 0 ))                    #等同于 [ $# -gt 0 ]
    do
        echo $*
        shift
    done
    CTRL+D
    /> . ./test4.sh a b c d e
    a b c d e
    b c d e
    c d e
    d e
    e        

    break命令声明格式:break [n]
    和C语言不同的是,Shell中break命令携带一个参数,即可以指定退出循环的层数。如果没有指定,其行为和C语言一样,即退出最内层循环。如果指定循环的层数,则退出指定层数的循环体。如果有3层嵌套循环,其中最外层的为1,中间的为2,最里面的是3。
    见如下示例脚本:
    /> cat > test5.sh
    while true
    do
        echo -n "Are you ready to move on?"
        read answer
        if [[ $answer == [Yy] ]]
        then
            break
        else
            echo "Come on."
        fi
    done
    echo "Here we are."
    CTRL+D
    /> . ./test5.sh
    Are you ready to move on? y
    Here we are

    continue命令声明格式:continue [n]
    和C语言不同的是,Shell中continue命令携带一个参数,即可以跳转到指定层级的循环顶部。如果没有指定,其行为和C语言一样,即跳转到最内层循环的顶部。如果指定循环的层数,则跳转到指定层级循环的顶部。如果有3层嵌套循环,其中最外层的为3,中间的为2,最里面的是1。
    /> cat  maillist                       #测试数据文件maillist的内容为以下信息。
    stephen
    ann
    sheryl
    mark

    /> cat > test6.sh
    for name in $(cat maillist)
    do
        if [[ $name == stephen ]]; then
            continue
        else
            echo "Hello, $name."
        fi
    done
    CTRL+D
    /> . ./test6.sh
    Hello, ann.
    Hello, sheryl.
    Hello, mark.

    I/O重新定向和子Shell:
    文件中的输入可以通过管道重新定向给一个循环,输出也可以通过管道重新定向给一个文件。Shell启动一个子Shell来处理I/O重新定向和管道。在循环终止时,循环内部定义的任何变量对于脚本的其他部分来说都是不可见的。
    /> cat > demodata                        #为下面的脚本构造测试数据
    abc
    def
    ghi
    CRTL+D
    /> cat > test7.sh
    if (( $# < 1 ))                                #如果脚本参数的数量小于1,则给出错误提示后退出。
    then
        echo "Usage: $0 filename " >&2
        exit 1
    fi
    count=1
    cat $1 | while read line                   #参数一中的文件被cat命令输出后,通过管道逐行输出给while read line。
    do
        let $((count == 1)) && echo "rocessing file $1..." > /dev/tty  #该行的echo将输出到当前终端窗口。
        echo -e "$count\t$line"              #将输出行号和文件中该行的内容,中间用制表符隔开。
        let count+=1
    done > outfile                               #将while循环中所有的输出,除了>/dev/tty之外,其它的全部输出到outfile文件。
    CTRL+D
    /> . ./test7.sh demodata                #只有一行输出,其余的都输出到outfile中了。
    Processing file demodata...
    /> cat outfile
    1       abc
    2       def
    3       ghi

    /> cat > test8.sh
    for i in 9 7 2 3 5 4
    do
        echo $i
    done | sort -n                                #直接将echo的输出通过管道重定向sort命令。
    CTRL+D
    /> . ./test8.sh
    2
    3
    4
    5
    7
    9

    5.  IFS和循环:
    Shell的内部域分隔符可以是空格、制表符和换行符。它可以作为命令的分隔符用在例如read、set和for等命令中。如果在列表中使用不同的分隔符,用户可以自己定义这个符号。在修改之前将IFS原始符号的值保存在另外一个变量中,这样在需要的时候还可以还原。
    见如下示例脚本:
    /> cat > test9.sh
    names=Stephen:Ann:Sheryl:John   #names变量包含的值用冒号分隔。
    oldifs=$IFS                                   #保留原有IFS到oldifs变量,便于后面的还原。
    IFS=":"                           
    for friends in $names                     #这是遍历以冒号分隔的names变量值。   
    do
        echo Hi $friends
    done
    IFS=$oldifs                                   #将IFS还原为原有的值。
    set Jerry Tom Angela
    for classmates in $*                      #再以原有IFS的值变量参数列表。
    do
        echo Hello $classmates
    done
    CTRL+D
    /> . ./test9.sh
    Hi Stephen
    Hi Ann
    Hi Sheryl
    Hi John
    Hello Jerry
    Hello Tom
    Hello Angela

    6.  函数:
    Shell中函数的职能以及优势和C语言或其它开发语言基本相同,只是语法格式上的一些差异。下面是Shell中使用函数的一些基本规则:
    1) 函数在使用前必须定义。
    2) 函数在当前环境下运行,它和调用它的脚本共享变量,并通过位置参量传递参数。而该位置参量将仅限于该函数,不会影响到脚本的其它地方。
    3) 通过local函数可以在函数内建立本地变量,该变量在出了函数的作用域之后将不在有效。
    4) 函数中调用exit,也将退出整个脚本。
    5) 函数中的return命令返回函数中最后一个命令的退出状态或给定的参数值,该参数值的范围是0-256之间。如果没有return命令,函数将返回最后一个Shell的退出值。
    6) 如果函数保存在其它文件中,就必须通过source或dot命令把它们装入当前脚本。
    7) 函数可以递归。
    将函数从Shell中清空需要执行:unset -f function_name。
    9) 将函数输出到子Shell需要执行:export -f function_name。
    10) 可以像捕捉Shell命令的返回值一样获取函数的返回值,如$(function_name)。
    Shell中函数的声明格式如下:
    function function_name { command; command; }
    见如下示例脚本:
    /> cat > test1.sh
    function increment() {            #定义函数increment。
        local sum                           #定义本地变量sum。
        let "sum=$1+1"   
        return $sum                      #返回值是sum的值。
    }
    echo -n "The num is "
    increment 5                          #increment函数调用。
    echo $?                                #输出increment函数的返回值。
    CTRL+D
    /> . ./test1.sh
    The num is 6

    7.  陷阱信号(trap):
    在Shell程序运行的时候,可能收到各种信号,有的来自于操作系统,有的来自于键盘,而该Shell在收到信号后就立刻终止运行。但是在有些时候,你可能并不希望在信号到达时,程序就立刻停止运行并退出。而是他能希望忽略这个信号而一直在运行,或者在退出前作一些清除操作。trap命令就允许你控制你的程序在收到信号以后的行为。
    其格式如下:
    trap 'command; command' signal-number
    trap 'command; command' signal-name
    trap signal-number  
    trap signal-name
    后面的两种形式主要用于信号复位,即恢复处理该信号的缺省行为。还需要说明的是,如果trap后面的命令是使用单引号括起来的,那么该命令只有在捕获到指定信号时才被执行。如果是双引号,则是在trap设置时就可以执行变量和命令替换了。
    下面是系统给出的信号数字和信号名称的对照表:
    1)SIGHUP 2)SIGINT 3)SIGQUIT 4)SIGILL 5)SIGTRAP 6)SIGABRT 7)SIGBUS SIGFPE
    9)SIGKILL 10) SIGUSR1 11)SIGEGV 12)SIGUSR2 13)SIGPIPE 14)SIGALRM 15)SIGTERM 17)SIGCHLD
    1SIGCONT 19)SIGSTOP ... ...
    见如下示例脚本:
    /> trap 'rm tmp*;exit 1' 1 2 15      #该命令表示在收到信号1、2和15时,该脚本将先执行rm tmp*,然后exit 1退出脚本。
    /> trap 2                                      #当收到信号2时,将恢复为以前的动作,即退出。
    /> trap " " 1 2                               #当收到信号1和2时,将忽略这两个信号。
    /> trap -                                       #表示恢复所有信号处理的原始值。
    /> trap 'trap 2' 2                           #在第一次收到信号2时,执行trap 2,这时将信号2的处理恢复为缺省模式。在收到信号2时,Shell程序退出。
    /> cat > test2.sh
    trap 'echo "Control+C will not terminate $0."' 2   #捕获信号2,即在键盘上按CTRL+C。
    trap 'echo "Control+\ will not terminate $0."' 3   #捕获信号3,即在键盘上按CTRL+\。
    echo "Enter stop to quit shell."
    while true                                                        #无限循环。
    do
        echo -n "Go Go...."
        read
        if [[ $REPLY == [Ss]top ]]                            #直到输入stop或Stop才退出循环和脚本。
       then
            break
        fi
    done
    CTRL+D
    /> . ./test2.sh
    Enter stop to quit shell.
    Go Go....^CControl+C will not terminate -bash.
    ^\Control+\ will not terminate -bash.
    stop

    8.  用getopts处理命令行选项:
    这里的getopts命令和C语言中的getopt几乎是一致的,因为脚本的位置参量在有些时候是失效的,如ls -lrt等。这时候-ltr都会被保存在$1中,而我们实际需要的则是三个展开的选项,即-l、-r和-t。见如下带有getopts的示例脚本:
    /> cat > test3.sh
    #!/bin/sh
    while getopts xy options                           #x和y是合法的选项,并且将-x读入到变量options中,读入时会将x前面的横线去掉。
    do
        case $options in
        x) echo "you entered -x as an option" ;;      
        y) echo "you entered -y as an option" ;;
        esac
    done
    /> ./test3.sh -xy
    you entered -x as an option
    you entered -y as an option
    /> ./test3.sh -x
    you entered -x as an option
    /> ./test3.sh -b                                       #如果输入非法选项,getopts会把错误信息输出到标准错误。
    ./test3.sh: illegal option -- b
    /> ./test3.sh b                                        #该命令不会有执行结果,因为b的前面有没横线,因此是非法选项,将会导致getopts停止处理并退出。

    /> cat > test4.sh
    #!/bin/sh
    while getopts xy options 2>/dev/null         #如果再出现选项错误的情况,该重定向会将错误输出到/dev/null。
    do
        case $options in
        x) echo "you entered -x as an option" ;;
        y) echo "you entered -y as an option" ;;
        \?) echo "Only -x and -y are valid options" 1>&2 # ?表示所有错误的选项,即非-x和-y的选项。
    esac
    done
    /> . ./test4.sh -g                                     #遇到错误的选项将直接执行\?)内的代码。
    Only -x and -y are valid options
    /> . ./test4.sh -xg
    you entered -x as an option
    Only -x and -y are valid options

    /> cat > test5.sh
    #!/bin/sh
    while getopts xyz: arguments 2>/dev/null #z选项后面的冒号用于提示getopts,z选项后面必须有一个参数。
    do
        case $arguments in
        x) echo "you entered -x as an option." ;;
        y) echo "you entered -y as an option." ;;
        z) echo "you entered -z as an option."  #z的后面会紧跟一个参数,该参数保存在内置变量OPTARG中。
            echo "\$OPTARG is $OPTARG.";
           ;;
        \?) echo "Usage opts4 [-xy] [-z argument]"
            exit 1 ;;
        esac
    done
    echo "The number of arguments passed was $(( $OPTIND - 1 ))" #OPTIND保存一下将被处理的选项的位置,他是永远比实际命令行参数多1的数。
    /> ./test5.sh -xyz foo
    you entered -x as an option.
    you entered -y as an option.
    you entered -z as an option.
    $OPTARG is foo.
    The number of arguments passed was 2
    /> ./test5.sh -x -y -z boo
    you entered -x as an option.
    you entered -y as an option.
    you entered -z as an option.
    $OPTARG is boo.
    The number of arguments passed was 4

    9.  eval命令与命令行解析:
    eval命令可以对命令行求值,做Shell替换,并执行命令行,通常在普通命令行解析不能满足要求时使用。
    /> set a b c d
    /> echo The last argument is \$$#
    The last argument is $4
    /> eval echo The last argument is \$$#    #eval命令先进行了变量替换,之后再执行echo命令。
    The last argument is d

论坛徽章:
3
天秤座
日期:2013-12-27 13:44:58射手座
日期:2014-05-22 16:52:43天蝎座
日期:2014-08-13 16:03:21
48 [报告]
发表于 2014-05-24 00:17 |只看该作者
Linux Shell常用技巧(九) 系统运行进程    1.  进程监控命令(ps):
    要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以 确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。
    ps命令存在很多的命令行选项和参数,然而我们最为常用只有两种形式,这里先给出与它们相关的选项和参数的含义:选项 说明
a 显示终端上的所有进程,包括其他用户的进程。
u 以用户为主的格式来显示程序状况。
x 显示所有程序,不以终端来区分。
-e 显示所有进程。
o 其后指定要输出的列,如user,pid等,多个列之间用逗号分隔。
-p 后面跟着一组pid的列表,用逗号分隔,该命令将只是输出这些pid的相关数据。

    /> ps aux

    root         1  0.0  0.1   2828  1400 ?        Ss   09:51   0:02 /sbin/init
    root         2  0.0  0.0      0          0 ?        S    09:51   0:00 [kthreadd]
    root         3  0.0  0.0      0          0 ?        S    09:51   0:00 [migration/0]
    ... ...   
    /> ps -eo user,pid,%cpu,%mem,start,time,command | head -n 4
    USER       PID %CPU %MEM  STARTED     TIME        COMMAND
    root         1         0.0    0.1   09:51:08     00:00:02  /sbin/init
    root         2         0.0    0.0   09:51:08     00:00:00  [kthreadd]
    root         3         0.0    0.0   09:51:08     00:00:00  [migration/0]
    这里需要说明的是,ps中存在很多和进程性能相关的参数,它们均以输出表格中的列的方式显示出来,在这里我们只是给出了非常常用的几个参数,至于更多参数,我们则需要根据自己应用的实际情况去看ps的man手册。
    #以完整的格式显示pid为1(init)的进程的相关数据
    /> ps -fp 1
    UID        PID  PPID  C STIME TTY          TIME   CMD
    root         1        0  0 05:16   ?        00:00:03 /sbin/init
   
    2.  改变进程优先级的命令(nice和renice):
    该Shell命令最常用的使用方式为:nice [-n <优先等级>][执行指令],其中优先等级的范围从-20-19,其中-20最高,19最低,只有系统管理者可以设置负数的等级。
    #后台执行sleep 100秒,同时在启动时将其nice值置为19
    /> nice -n 19 sleep 100 &
    [1] 4661
    #后台执行sleep 100秒,同时在启动时将其nice值置为-19
    /> nice -n -19 sleep 100 &
    [2] 4664
    #关注ps -l输出中用黄色高亮的两行,它们的NI值和我们执行是设置的值一致。
    /> ps -l
    F S   UID   PID  PPID  C PRI  NI  ADDR  SZ    WCHAN  TTY       TIME        CMD
    4 S     0  2833  2829  0  80   0     -      1739     -         pts/2    00:00:00  bash
    0 S     0  4661  2833  0  99  19    -      1066     -         pts/2    00:00:00  sleep
    4 S     0  4664  2833  0  61 -19    -      1066     -         pts/2    00:00:00  sleep
    4 R     0  4665  2833  1  80   0     -      1231     -         pts/2    00:00:00  ps
   
    renice命令主要用于为已经执行的进程重新设定nice值,该命令包含以下几个常用选项:

选项 说明
-g 使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。
-p 改变该程序的优先权等级,此参数为预设值。
-u 指定用户名称,修改所有隶属于该用户的程序的优先权。

    #切换到stephen用户下执行一个后台进程,这里sleep进程将在后台睡眠1000秒。
    /> su stephen
    /> sleep 1000&  
    [1] 4812
    /> exit   #退回到切换前的root用户
    #查看已经启动的后台sleep进程,其ni值为0,宿主用户为stephen
    /> ps -eo user,pid,ni,command | grep stephen
    stephen   4812   0 sleep 1000
    root        4821    0 grep  stephen
    #以指定用户的方式修改该用户下所有进程的nice值
    /> renice -n 5 -u stephen
    500: old priority 0, new priority 5
    #从再次执行ps的输出结果可以看出,该sleep后台进程的nice值已经调成了5
    /> ps -eo user,pid,ni,command | grep stephen
    stephen   4812   5 sleep 1000
    root         4826   0 grep  stephen
    #以指定进程pid的方式修改该进程的nice值
    /> renice -n 10 -p 4812
    4812: old priority 5, new priority 10
    #再次执行ps,该sleep后台进程的nice值已经从5变成了10
    /> ps -eo user,pid,ni,command | grep stephen
    stephen   4812  10 sleep 1000
    root        4829   0 grep  stephen


    3.  列出当前系统打开文件的工具(lsof):
    lsof(list opened files),其重要功能为列举系统中已经被打开的文件,如果没有指定任何选项或参数,lsof则列出所有活动进程打开的所有文件。众所周知,linux环境中任何事物都是文件,如设备、目录、sockets等。所以,用好lsof命令,对日常的linux管理非常有帮助。下面先给出该命令的常用选项:

选项 说明
-a 该选项会使后面选项选出的结果列表进行and操作。
-c command_prefix 显示以command_prefix开头的进程打开的文件。
-p PID 显示指定PID已打开文件的信息
+d directory 从文件夹directory来搜寻(不考虑子目录),列出该目录下打开的文件信息。
+D directory 从文件夹directory来搜寻(考虑子目录),列出该目录下打开的文件信息。
-d num_of_fd 以File Descriptor的信息进行匹配,可使用3-10,表示范围,3,10表示某些值。
-u user 显示某用户的已经打开的文件,其中user可以使用正则表达式。
-i 监听指定的协议、端口、主机等的网络信息,格式为:[proto][@host|addr][:svc_list|port_list]

    #查看打开/dev/null文件的进程。
    /> lsof /dev/null | head -n 5
    COMMAND    PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    init         1      root    0u   CHR    1,3      0t0 3671 /dev/null
    init         1      root    1u   CHR    1,3      0t0 3671 /dev/null
    init         1      root    2u   CHR    1,3      0t0 3671 /dev/null
    udevd 397      root    0u   CHR    1,3      0t0 3671 /dev/null

    #查看打开22端口的进程
    /> lsof -i:22
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd    1582 root    3u  IPv4  11989      0t0  TCP *:ssh (LISTEN)
    sshd    1582 root    4u  IPv6  11991      0t0  TCP *:ssh (LISTEN)
    sshd    2829 root    3r   IPv4  19635      0t0  TCP bogon:ssh->bogon:15264 (ESTABLISHED)

    #查看init进程打开的文件
    />  lsof -c init
    COMMAND PID USER   FD   TYPE     DEVICE   SIZE/OFF   NODE    NAME
    init               1 root  cwd      DIR        8,2     4096              2        /
    init               1 root  rtd       DIR        8,2     4096              2        /
    init               1 root  txt       REG       8,2   136068       148567     /sbin/init
    init               1 root  mem    REG        8,2    58536      137507     /lib/libnss_files-2.12.so
    init               1 root  mem    REG        8,2   122232     186675     /lib/libgcc_s-4.4.4-20100726.so.1
    init               1 root  mem    REG        8,2   141492     186436     /lib/ld-2.12.so
    init               1 root  mem    REG        8,2  1855584    186631     /lib/libc-2.12.so
    init               1 root  mem    REG        8,2   133136     186632     /lib/libpthread-2.12.so
    init               1 root  mem    REG        8,2    99020      180422     /lib/libnih.so.1.0.0
    init               1 root  mem    REG        8,2    37304      186773     /lib/libnih-dbus.so.1.0.0
    init               1 root  mem    REG        8,2    41728      186633     /lib/librt-2.12.so
    init               1 root  mem    REG        8,2   286380     186634     /lib/libdbus-1.so.3.4.0
    init               1 root    0u     CHR        1,3      0t0           3671      /dev/null
    init               1 root    1u     CHR        1,3      0t0           3671      /dev/null
    init               1 root    2u     CHR        1,3      0t0           3671      /dev/null
    init               1 root    3r      FIFO       0,8      0t0           7969      pipe
    init               1 root    4w     FIFO       0,8      0t0           7969      pipe
    init               1 root    5r      DIR        0,10        0             1         inotify
    init               1 root    6r      DIR        0,10        0             1         inotify
    init               1 root    7u     unix   0xf61e3840  0t0       7970      socket
    init               1 root    9u     unix   0xf3bab280  0t0      11211     socket
    在上面输出的FD列中,显示的是文件的File Descriptor number,或者如下的内容:
    cwd:  current working directory;
    mem:  memory-mapped file;
    mmap: memory-mapped device;
    pd:   parent directory;
    rtd:  root directory;
    txt:  program text (code and data);
    文件的File Descriptor number显示模式有:
    r for read access;
    w for write access;
    u for read and write access;

    在上面输出的TYPE列中,显示的是文件类型,如:
    DIR:  目录
    LINK: 链接文件
    REG:  普通文件


    #查看pid为1的进程(init)打开的文件,其输出结果等同于上面的命令,他们都是init。
    /> lsof -p 1
    #查看owner为root的进程打开的文件。
    /> lsof -u root
    #查看owner不为root的进程打开的文件。
    /> lsof -u ^root
    #查看打开协议为tcp,ip为192.168.220.134,端口为22的进程。
    /> lsof -i tcp@192.168.220.134:22
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd        2829 root     3r    IPv4  19635      0t0      TCP    bogon:ssh->bogon:15264 (ESTABLISHED)   
    #查看打开/root文件夹,但不考虑目录搜寻
    /> lsof +d /root
    #查看打开/root文件夹以及其子目录搜寻
    /> lsof +D /root
    #查看打开FD(0-3)文件的所有进程
    /> lsof -d 0-3
    #-a选项会将+d选项和-c选项的选择结果进行and操作,并输出合并后的结果。
    /> lsof +d .
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
    bash       9707  root  cwd    DIR    8,1     4096         39887 .
    lsof         9791  root  cwd    DIR    8,1     4096         39887 .
    lsof         9792  root  cwd    DIR    8,1     4096         39887 .
    /> lsof -a -c bash +d .
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
    bash        9707 root  cwd    DIR    8,1     4096         39887 .
    最后需要额外说明的是,如果在文件名的末尾存在(delete),则说明该文件已经被删除,只是还存留在cache中。


    4.  进程查找/杀掉命令(pgrep/pkill):
    查找和杀死指定的进程, 他们的选项和参数完全相同, 这里只是介绍pgrep。下面是常用的命令行选项:

选项 说明
-d 定义多个进程之间的分隔符, 如果不定义则使用换行符。
-n 表示如果该程序有多个进程正在运行,则仅查找最新的,即最后启动的。
-o 表示如果该程序有多个进程正在运行,则仅查找最老的,即最先启动的。
-G 其后跟着一组group id,该命令在搜索时,仅考虑group列表中的进程。
-u 其后跟着一组有效用户ID(effetive user id),该命令在搜索时,仅考虑该effective user列表中的进程。
-U 其后跟着一组实际用户ID(real user id),该命令在搜索时,仅考虑该real user列表中的进程。
-x 表示进程的名字必须完全匹配, 以上的选项均可以部分匹配。
-l 将不仅打印pid,也打印进程名。
-f 一般与-l合用, 将打印进程的参数。
    #手工创建两个后台进程
    /> sleep 1000&
    3456
    /> sleep 1000&
    3457

    #查找进程名为sleep的进程,同时输出所有找到的pid
    /> pgrep sleep
    3456
    3457
    #查找进程名为sleep的进程pid,如果存在多个,他们之间使用:分隔,而不是换行符分隔。
    /> pgrep -d: sleep
    3456:3457
    #查找进程名为sleep的进程pid,如果存在多个,这里只是输出最后启动的那一个。
    /> pgrep -n sleep
    3457
    #查找进程名为sleep的进程pid,如果存在多个,这里只是输出最先启动的那一个。
    /> pgrep -o  sleep
    3456
    #查找进程名为sleep,同时这个正在运行的进程的组为root和stephen。
    /> pgrep -G root,stephen sleep
    3456
    3457
    #查找有效用户ID为root和oracle,进程名为sleep的进程。
    /> pgrep -u root,oracle sleep
    3456
    3457
    #查找实际用户ID为root和oracle,进程名为sleep的进程。
    /> pgrep -U root,oracle sleep
    3456
    3457
    #查找进程名为sleep的进程,注意这里找到的进程名必须和参数中的完全匹配。
    /> pgrep -x sleep
    3456
    3457
    #-x不支持部分匹配,sleep进程将不会被查出,因此下面的命令没有结果。
    /> pgrep -x sle
    #查找进程名为sleep的进程,同时输出所有找到的pid和进程名。   
    /> pgrep -l sleep
    3456 sleep
    3457 sleep
    #查找进程名为sleep的进程,同时输出所有找到的pid、进程名和启动时的参数。
    /> pgrep -lf sleep
    3456 sleep 1000
    3457 sleep 1000
    #查找进程名为sleep的进程,同时以逗号为分隔符输出他们的pid,在将结果传给ps命令,-f表示显示完整格式,-p显示pid列表,ps将只是输出该列表内的进程数据。
    /> pgrep -f sleep -d, | xargs ps -fp
    UID        PID  PPID  C STIME TTY          TIME CMD
    root      3456  2138  0 06:11 pts/5    00:00:00 sleep 1000
    root      3457  2138  0 06:11 pts/5    00:00:00 sleep 1000

论坛徽章:
3
天秤座
日期:2013-12-27 13:44:58射手座
日期:2014-05-22 16:52:43天蝎座
日期:2014-08-13 16:03:21
49 [报告]
发表于 2014-05-26 09:45 |只看该作者
细说Linux系统优化-实践篇 .  作为一名linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行,但是由于硬件问题、软件问题、网络环境等的复杂性 和多变性,导致对系统的优化变得异常复杂,如何定位性能问题出在哪个方面,是性能优化的一大难题, 本章从系统入手,重点讲述由于系统软、硬件配置不当可能造成的性能问题,并且给出了检测系统故障和优化性能的一般方法和流程。
1 cpu性能评估
Cpu是影响Linux性能的主要因素之一,下面先介绍几个查看CPU性能的命令。
1.1 vmstat命令
该命令可以显示关于系统各种资源之间相关性能的简要信息,这里我们主要用它来看CPU的一个负载情况。
下面是vmstat命令在某个系统的输出结果:


点击(此处)折叠或打开
1.[root@node1 ~]# vmstat 2 3
2.procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
3.r b swpd free buff cache si so bi bo in cs us sy id wa st
4.0 0 0 162240 8304 67032 0 0 13 21 1007 23 0 1 98 0 0
5.0 0 0 162240 8304 67032 0 0 1 0 1010 20 0 1 100 0 0
6.0 0 0 162240 8304 67032 0 0 1 1 1009 18 0 1 99 0 0

对上面每项的输出解释如下:
? procs
? r列表示运行和等待cpu时间片的进程数,这个值如果长期大于系统CPU的个数,说明CPU不足,需要增加CPU。
? b列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
? memory
? swpd列表示切换到内存交换区的内存数量(以k为单位)。如果swpd的值不为0,或者比较大,只要si、so的值长期为0,这种情况下一般不用担心,不会影响系统性能。
? free列表示当前空闲的物理内存数量(以k为单位)
? buff列表示buffers cache的内存数量,一般对块设备的读写才需要缓冲。
? cache列表示page cached的内存数量,一般作为文件系统cached,频繁访问的文件都会被cached,如果cache值较大,说明cached的文件数较多,如果此时IO中bi比较小,说明文件系统效率比较好。
? swap
? si列表示由磁盘调入内存,也就是内存进入内存交换区的数量。
? so列表示由内存调入磁盘,也就是内存交换区进入内存的数量。
一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足。需要增加系统内存。
? IO项显示磁盘读写状况
? Bi列表示从块设备读入数据的总量(即读磁盘)(每秒kb)。
? Bo列表示写入到块设备的数据总量(即写磁盘)(每秒kb)
这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大,则表示系统磁盘IO有问题,应该考虑提高磁盘的读写性能。
? system 显示采集间隔内发生的中断数
? in列表示在某一时间间隔中观测到的每秒设备中断数。
? cs列表示每秒产生的上下文切换次数。
上面这2个值越大,会看到由内核消耗的CPU时间会越多。
? CPU项显示了CPU的使用状态,此列是我们关注的重点。
? us列显示了用户进程消耗的CPU 时间百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,就需要考虑优化程序或算法。
? sy列显示了内核进程消耗的CPU时间百分比。Sy的值较高时,说明内核消耗的CPU资源很多。
根据经验,us+sy的参考值为80%,如果us+sy大于 80%说明可能存在CPU资源不足。
? id 列显示了CPU处在空闲状态的时间百分比。
? wa列显示了IO等待所占用的CPU时间百分比。wa值越高,说明IO等待越严重,根据经验,wa的参考值为20%,如果wa超过20%,说明IO等待严重,引起IO等待的原因可能是磁盘大量随机读写造成的,也可能是磁盘或者磁盘控制器的带宽瓶颈造成的(主要是块操作)。
综上所述,在对CPU的评估中,需要重点注意的是procs项r列的值和CPU项中us、sy和id列的值。
1.2  sar命令
检查CPU性能的第二个工具是sar,sar功能很强大,可以对系统的每个方面进行单独的统计,但是使用sar命令会增加系统开销,不过这些开销是可以评估的,对系统的统计结果不会有很大影响。
下面是sar命令对某个系统的CPU统计输出:


点击(此处)折叠或打开
1.[root@webserver ~]# sar -u 3 5
2.Linux 2.6.9-42.ELsmp (webserver) 11/28/2008 _i686_ (8 CPU)
3.11:41:24 AM CPU %user %nice %system %iowait %steal %idle
4.11:41:27 AM all 0.88 0.00 0.29 0.00 0.00 98.83
5.11:41:30 AM all 0.13 0.00 0.17 0.21 0.00 99.50
6.11:41:33 AM all 0.04 0.00 0.04 0.00 0.00 99.92
7.11:41:36 AM all 0.29 0.00 0.13 0.00 0.00 99.58
8.11:41:39 AM all 0.38 0.00 0.17 0.04 0.00 99.41
9.Average: all 0.34 0.00 0.16 0.05 0.00 99.45

对上面每项的输出解释如下:
? %user列显示了用户进程消耗的CPU 时间百分比。
? %nice列显示了运行正常进程所消耗的CPU 时间百分比。
? %system列显示了系统进程消耗的CPU时间百分比。
? %iowait列显示了IO等待所占用的CPU时间百分比
? %steal列显示了在内存相对紧张的环境下pagein强制对不同的页面进行的steal操作 。
? %idle列显示了CPU处在空闲状态的时间百分比。
这个输出是对系统整体CPU使用状况的统计,每项的输出都非常直观,并且最后一行Average是个汇总行,是上面统计信息的一个平均值。
需要注意的一点是:第一行的统计信息中包含了sar本身的统计消耗,所以%user列的值会偏高一点,不过,这不会对统计结果产生多大影响。
在一个多CPU的系统中,如果程序使用了单线程,会出现这么一个现象,CPU的整体使用率不高,但是系统应用却响应缓慢,这可能是由于程序使用单线程的原因,单线程只使用一个CPU,导致这个CPU占用率为100%,无法处理其它请求,而其它的CPU却闲置,这就导致 了整体CPU使用率不高,而应用缓慢 现象的发生 。
针对这个问题,可以对系统的每个CPU分开查询,统计每个CPU的使用情况:


点击(此处)折叠或打开
1.[root@webserver ~]# sar -P 0 3 5
2.Linux 2.6.9-42.ELsmp (webserver) 11/29/2008 _i686_ (8 CPU)
3.06:29:33 PM CPU %user %nice %system %iowait %steal %idle
4.06:29:36 PM 0 3.00 0.00 0.33 0.00 0.00 96.67
5.06:29:39 PM 0 0.67 0.00 0.33 0.00 0.00 99.00
6.06:29:42 PM 0 0.00 0.00 0.33 0.00 0.00 99.67
7.06:29:45 PM 0 0.67 0.00 0.33 0.00 0.00 99.00
8.06:29:48 PM 0 1.00 0.00 0.33 0.33 0.00 98.34
9.Average: 0 1.07 0.00 0.33 0.07 0.00 98.53
这个输出是对系统的第一颗CPU的信息统计,需要注意的是,sar中对CPU的计数是从0开始的,因此,“sar -P 0 3 5”表示对系统的第一颗CPU进行信息统计,“sar -P 4 3 5”则表示对系统的第五颗CPU进行统计。依次类推。可以看出,上面的系统有八颗CPU。
1.3 iostat命令
iostat指令主要用于统计磁盘IO状态,但是也能查看CPU的使用信息,它的局限性是只能显示系统所有CPU的平均信息,看下面的一个输出:


点击(此处)折叠或打开
1.[root@webserver ~]# iostat -c
2.Linux 2.6.9-42.ELsmp (webserver) 11/29/2008 _i686_ (8 CPU)
3.avg-cpu: %user %nice %system %iowait %steal %idle
4.2.52 0.00 0.30 0.24 0.00 96.96
在这里,我们使用了“-c”参数,只显示系统CPU的统计信息,输出中每项代表的含义与sar命令的输出项完全相同,不再详述。
1.4 uptime命令
uptime是监控系统性能最常用的一个命令,主要用来统计系统当前的运行状况,输出的信息依次为:系统现在的时间、系统从上次开机到现在运行了多长时间、系统目前有多少登陆用户、系统在一分钟内、五分钟内、十五分钟内的平均负载。看下面的一个输出:


点击(此处)折叠或打开
1.[root@webserver ~]# uptime
2.18:52:11 up 27 days, 19:44, 2 users, load average: 0.12, 0.08, 0.08

这里需要注意的是load average这个输出值,这三个值的大小一般不能大于系统CPU的个数,例如,本输出中系统有8个CPU,如果load average的三个值长期大于8时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于8时,倒不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的时间片,比如本例中的输出,CPU是非常空闲的。
1.5 本节小结
上面介绍了检查CPU使用状况的四个命令,通过这些命令需要了解的是:系统CPU是否出现性能瓶颈,也就是说,以上这些命令只能查看CPU是否繁忙,负载是否过大,但是无法知道CPU为何负载过大,因而,判断系统CPU出现问题后,要结合top、ps等命令进一步检查是由那些进程导致CPU负载过大的。引起CPU资源紧缺的原因可能是应用程序不合理造成的,也可能是硬件资源匮乏引起的,所以,要具体问题具体分析,或者优化应用程序,或者增加系统CPU资源。
2 内存性能评估
内存的管理和优化是系统性能优化的一个重要部分,内存资源的充足与否直接影响应用系统的使用性能,在进行内存优化之前,一定要熟悉linux的内存管理机制,这一点我们在前面的章节已经有深入讲述,本节的重点是如何通过系统命令监控linux系统的内存使用状况。
2.1 free 命令
free是监控linux内存使用状况最常用的指令,看下面的一个输出:


点击(此处)折叠或打开
1.[root@webserver ~]# free -m
2.total used free shared buffers cached
3.Mem: 8111 7185 925 0 243 6299
4.-/+ buffers/cache: 643 7468
5.Swap: 8189 0 8189
  “free –m”表示以M为单位查看内存使用情况,在这个输出中,我们重点关注的应该是free列与cached列的输出值,由输出可知,此系统共8G内存,系统空闲内存还有925M,其中,Buffer Cache占用了243M,Page Cache占用了6299M,由此可知系统缓存了很多的文件和目录,而对于应用程序来说,可以使用的内存还有7468M,当然这个7468M包含了Buffer Cache和Page Cache的值。在swap项可以看出,交换分区还未使用。所以从应用的角度来说,此系统内存资源还非常充足。
  一般有这样一个经验公式:应用程序可用内存/系统物理内存>70%时,表示系统内存资源非常充足,不影响系统性能,应用程序可用内存/系统物理内存<20%时,表示系统内存资源紧缺,需要增加系统内存,20%<应用程序可用内存/系统物理内存<70%时,表示系统内存资源基本能满足应用需求,暂时不影响系统性能。
  free命令还可以适时的监控内存的使用状况,使用“-s”参数可以在指定的时间段内不间断的监控内存的使用情况:


点击(此处)折叠或打开
1.[root@webserver ~]# free -b -s 5
2.total used free shared buffers cached
3.Mem: 8505901056 7528706048 977195008 0 260112384 6601158656
4.-/+ buffers/cache: 667435008 7838466048
5.Swap: 8587149312 163840 8586985472
6.total used free shared buffers cached
7.Mem: 8505901056 7526936576 978964480 0 260128768 6601142272
8.-/+ buffers/cache: 665665536 7840235520
9.Swap: 8587149312 163840 8586985472
10.total used free shared buffers cached
11.Mem: 8505901056 7523987456 981913600 0 260141056 6601129984
12.-/+ buffers/cache: 662716416 7843184640
13.Swap: 8587149312 163840 8586985472
  其中,“-b”表示以千字节(也就是1024字节为单位)来显示内存使用情况。
2.2 通过watch与free相结合动态监控内存状况
watch是一个非常有用的命令,几乎每个linux发行版都带有这个工具,通过watch,可以动态的监控命令的运行结果,省去手动执行的麻烦。
  可以在watch后面跟上需要运行的命令,watch就会自动重复去运行这个命令,默认是2秒钟执行一次,并把执行的结果更新在屏幕上。例如:


点击(此处)折叠或打开
1.[root@webserver ~]# watch -n 3 -d free
2.Every 3.0s: free Sun Nov 30 16:23:20 2008
3.total used free shared buffers cached
4.Mem: 8306544 7349548 956996 0 203296 6500024
5.-/+ buffers/cache: 646228 7660316
6.Swap: 8385888 160 8385728

其中,“-n”指定重复执行的时间,“-d”表示高亮显示变动。
2.3 vmstat命令监控内存
vmstat命令在监控系统内存方面功能强大,请看下面的一个输出:


点击(此处)折叠或打开
1.procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
2.r b swpd free buff cache si so bi bo in cs us sy id wa
3.0 0 906440 22796 155616 1325496 340 180 2 4 1 4 80 0 10 10
4.0 0 906440 42796 155616 1325496 320 289 0 54 1095 287 70 15 0 15
5.0 0 906440 42884 155624 1325748 236 387 2 102 1064 276 78 2 5 15

对于内存的监控,在vmstat中重点关注的是swpd、si和so行,从这个输出可以看出,此系统内存资源紧缺,swpd占用了900M左右内存,si和so占用很大,而由于系统内存的紧缺,导致出现15%左右的系统等待,此时增加系统的内存是必须要做的。
2.4 sar -r命令组合
sar命令也可以监控linux的内存使用状况,可以通过“sar –r”组合查看系统内存和交换空间的使用率。请看下面的一个输出:


点击(此处)折叠或打开
1.[root@webserver ~]# sar -r 2 3
2.Linux 2.6.9-42.ELsmp (webserver) 11/30/2008 _i686_ (8 CPU)
3.09:57:33 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
4.09:57:35 PM 897988 7408556 89.19 249428 6496532 786556 4.71
5.09:57:37 PM 898564 7407980 89.18 249428 6496532 784276 4.70
6.09:57:39 PM 899196 7407348 89.17 249440 6496520 782132 4.69
7.Average: 898583 7407961 89.18 249432 6496528 784321 4.70

其中:
Kbmemfree表示空闲物理内存大小,kbmemused表示已使用的物理内存空间大小,%memused表示已使用内存占总内存大小的百分比,kbbuffers和kbcached分别表示Buffer Cache和Page Cache的大小,kbcommit和%commit分别表示应用程序当前使用的内存大小和使用百分比。
可以看出sar的输出其实与free的输出完全对应,不过sar更加人性化,不但给出了内存使用量,还给出了内存使用的百分比以及统计的平均值。从%commit项可知,此系统目前内存资源充足。
2.5 本节小结
上面介绍了内存监控常用的几个指令以及一些经验规则,其实现在的系统在内存方面出现的瓶颈已经很少,因为内存价格很低,充足的内存已经完全能满足应用程序和系统本身的需要,如果系统在内存方面出现瓶颈,很大的可能是应用程序本身的问题造成的。
3 磁盘I/O性能评估
在对磁盘I/O性能做评估之前,必须知道的几个方面是:
? 熟悉RAID存储方式,可以根据应用的不同,选择不同的RAID方式,例如,如果一个应用经常有大量的读操作,可以选择RAID5方式构建磁盘阵列存储数据,如果应用有大量的、频繁的写操作,可以选择raid0存取方式,如果应用对数据安全要求很高,同时对读写也有要求的话,可以考虑raid01存取方式等等。
? 尽可能用内存的读写代替直接磁盘I/O,使频繁访问的文件或数据放入内存中进行操作处理,因为内存读写操作比直接磁盘读写的效率要高千倍。
? 将经常进行读写的文件与长期不变的文件独立出来,分别放置到不同的磁盘设备上。
? 对于写操作频繁的数据,可以考虑使用裸设备代替文件系统。这里简要讲述下文件系统与裸设备的对比:
使用裸设备的优点有:
? 数据可以直接读写,不需要经过操作系统级的缓存,节省了内存资源,避免了内存资源争用。
? 避免了文件系统级的维护开销,比如文件系统需要维护超级块、I-node等。
? 避免了操作系统的cache预读功能,减少了I/O请求。
使用裸设备的缺点是:
? 数据管理、空间管理不灵活,需要很专业的人来操作。
其实裸设备的优点就是文件系统的缺点,反之也是如此,这就需要我们做出合理的规划和衡量,根据应用的需求,做出对应的策略。
下面接着介绍对磁盘IO的评估标准。
3.1 sar -d命令组合
通过“sar –d”组合,可以对系统的磁盘IO做一个基本的统计,请看下面的一个输出:


点击(此处)折叠或打开
1.[root@webserver ~]# sar -d 2 3
2.Linux 2.6.9-42.ELsmp (webserver) 11/30/2008 _i686_ (8 CPU)
3.11:09:33 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
4.11:09:35 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
5.11:09:35 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
6.11:09:37 PM dev8-0 1.00 0.00 12.00 12.00 0.00 0.00 0.00 0.00
7.11:09:37 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
8.11:09:39 PM dev8-0 1.99 0.00 47.76 24.00 0.00 0.50 0.25 0.05
9.Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
10.Average: dev8-0 1.00 0.00 19.97 20.00 0.00 0.33 0.17 0.02

对上面每项的输出解释如下:
? DEV表示磁盘设备名称。
? tps表示每秒到物理磁盘的传送数,也就是每秒的I/O流量。一个传送就是一个I/O请求,多个逻辑请求可以被合并为一个物理I/O请求。
? rd_sec/s表示每秒从设备读取的扇区数(1扇区=512字节)。
? wr_sec/s表示每秒写入设备的扇区数目。
? avgrq-sz表示平均每次设备I/O操作的数据大小(以扇区为单位)。
? avgqu-sz表示平均I/O队列长度。
? await表示平均每次设备I/O操作的等待时间(以毫秒为单位)。
? svctm表示平均每次设备I/O操作的服务时间(以毫秒为单位)。
? %util表示一秒中有百分之几的时间用于I/O操作。
Linux中I/O请求系统与现实生活中超市购物排队系统有很多类似的地方,通过对超市购物排队系统的理解,可以很快掌握linux中I/O运行机制。比如:
avgrq-sz类似与超市排队中每人所买东西的多少。
avgqu-sz类似与超市排队中单位时间内平均排队的人数。
await类似与超市排队中每人的等待时间。
svctm类似与超市排队中收银员的收款速度。
%util类似与超市收银台前有人排队的时间比例。
对以磁盘IO性能,一般有如下评判标准:
正常情况下svctm应该是小于await值的,而svctm的大小和磁盘性能有关,CPU、内存的负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加。
await值的大小一般取决与svctm的值和I/O队列长度以及I/O请求模式,如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。
%util项的值也是衡量磁盘I/O的一个重要指标,如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去,势必影响系统的性能,可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题。
3.2 iostat –d命令组合
通过“iostat –d”命令组合也可以查看系统磁盘的使用状况,请看如下输出:




点击(此处)折叠或打开
1.[root@webserver ~]# iostat -d 2 3
2.Linux 2.6.9-42.ELsmp (webserver) 12/01/2008 _i686_ (8 CPU)
3.Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
4.sda 1.87 2.58 114.12 6479462 286537372
5.Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
6.sda 0.00 0.00 0.00 0 0
7.Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
8.sda 1.00 0.00 12.00 0 24

对上面每项的输出解释如下:
? Blk_read/s表示每秒读取的数据块数。
? Blk_wrtn/s表示每秒写入的数据块数。
? Blk_read表示读取的所有块数
? Blk_wrtn表示写入的所有块数。
这里需要注意的一点是:上面输出的第一项是系统从启动以来到统计时的所有传输信息,从第二次输出的数据才代表在检测的时间段内系统的传输值。
可以通过Blk_read/s和Blk_wrtn/s的值对磁盘的读写性能有一个基本的了解,如果Blk_wrtn/s值很大,表示磁盘的写操作很频繁,可以考虑优化磁盘或者优化程序,如果Blk_read/s值很大,表示磁盘直接读取操作很多,可以将读取的数据放入内存中进行操作。对于这两个选项的值没有一个固定的大小,根据系统应用的不同,会有不同的值,但是有一个规则还是可以遵循的:长期的、超大的数据读写,肯定是不正常的,这种情况一定会影响系统性能。
“iostat –x”组合还提供了对每个磁盘的单独统计,如果不指定磁盘,默认是对所有磁盘进行统计,请看下面的一个输出:


点击(此处)折叠或打开
1.[root@webserver ~]# iostat -x /dev/sda 2 3
2.Linux 2.6.9-42.ELsmp (webserver) 12/01/2008 _i686_ (8 CPU)
3.avg-cpu: %user %nice %system %iowait %steal %idle
4.2.45 0.00 0.30 0.24 0.00 97.03
5.Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
6.sda 0.01 12.48 0.10 1.78 2.58 114.03 62.33 0.07 38.39 1.30 0.24
7.avg-cpu: %user %nice %system %iowait %steal %idle
8.3.97 0.00 1.83 8.19 0.00 86.14
9.Device:rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
10.sda 0.00 195.00 0.00 18.00 0.00 1704.00 94.67 0.04 2.50 0.11 0.20
11.avg-cpu: %user %nice %system %iowait %steal %idle
12.4.04 0.00 1.83 8.01 0.00 86.18
13.Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
14.sda 0.00 4.50 0.00 7.00 0.00 92.00 13.14 0.01 0.79 0.14 0.10

这个输出基本与“sar –d”相同,需要说明的几个选项的含义为:
? rrqm/s表示每秒进行merged的读操作数目。
? wrqm/s表示每秒进行 merge 的写操作数目。
? r/s表示每秒完成读I/O设备的次数。
? w/s表示每秒完成写I/O设备的次数。
? rsec/s表示每秒读取的扇区数。
? wsec/s表示每秒写入的扇区数。
3.3 vmstat –d组合
通过“vmstat –d”组合也可以查看磁盘的统计数据,情况下面的一个输出:


点击(此处)折叠或打开
1.[root@webserver ~]# vmstat -d 3 2|grep sda
2.disk- ------------reads------------ ------------writes----------- -----IO------
3.total merged sectors ms total merged sectors ms cur sec
4.sda 239588 29282 6481862 1044442 4538678 32387680 295410812 186025580 0 6179
5.disk- ------------reads------------ ------------writes----------- -----IO------
6.total merged sectors ms total merged sectors ms cur sec
7.sda 239588 29282 6481862 1044442 4538680 32387690 295410908 186025581 0 6179

这个输出显示了磁盘的reads、writes和IO的使用状况。
3.4 本节小结
上面主要讲解了对磁盘I/O的性能评估,其实衡量磁盘I/O好坏是多方面的,有应用程序本身的,也有硬件设计上的,还有系统自身配置的问题等,要解决I/O的瓶颈,关键是要提高I/O子系统的执行效率。例如,首要要从应用程序上对磁盘读写进行优化,能够放到内存执行的操作,尽量不要放到磁盘,同时对磁盘存储方式进行合理规划,选择适合自己的RAID存取方式,最后,在系统级别上,可以选择适合自身应用的文件系统,必要时使用裸设备提高读写性能。
4 网络性能评估
网络性能的好坏直接影响应用程序对外提供服务的稳定性和可靠性,监控网络性能,可以从以下几个方面进行管理和优化。
4.1 通过ping命令检测网络的连通性
如果发现网络反应 缓慢,或者连接中断,可以通过ping来测试网络的连通情况,请看下面的一个输出:


点击(此处)折叠或打开
1.[root@webserver ~]# ping 10.10.1.254
2.PING 10.10.1.254 (10.10.1.254) 56(84) bytes of data.
3.64 bytes from 10.10.1.254: icmp_seq=0 ttl=64 time=0.235 ms
4.64 bytes from 10.10.1.254: icmp_seq=1 ttl=64 time=0.164 ms
5.64 bytes from 10.10.1.254: icmp_seq=2 ttl=64 time=0.210 ms
6.64 bytes from 10.10.1.254: icmp_seq=3 ttl=64 time=0.178 ms
7.64 bytes from 10.10.1.254: icmp_seq=4 ttl=64 time=0.525 ms
8.64 bytes from 10.10.1.254: icmp_seq=5 ttl=64 time=0.571 ms
9.64 bytes from 10.10.1.254: icmp_seq=6 ttl=64 time=0.220 ms
10.--- 10.10.1.254 ping statistics ---
11.7 packets transmitted, 7 received, 0% packet loss, time 6000ms
12.rtt min/avg/max/mdev = 0.164/0.300/0.571/0.159 ms, pipe 2



在这个输出中,time值显示了两台主机之间的网络延时情况,如果此值很大,则表示网络的延时很大,单位为毫秒。在这个输出的最后,是对上面输出信息的一个总结,packet loss表示网络的丢包率,此值越小,表示网络的质量越高。
4.2 通过netstat –i组合检测网络接口状况
netstat命令提供了网络接口的详细信息,请看下面的输出:


点击(此处)折叠或打开
1.[root@webserver ~]# netstat -i
2.Kernel Interface table
3.Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
4.eth0 1500 0 1313129253 0 0 0 1320686497 0 0 0 BMRU
5.eth1 1500 0 494902025 0 0 0 292358810 0 0 0 BMRU
6.lo 16436 0 41901601 0 0 0 41901601 0 0 0 LRU

对上面每项的输出解释如下:
? Iface表示网络设备的接口名称。
? MTU表示最大传输单元,单位字节。
? RX-OK/TX-OK表示已经准确无误的接收/发送了多少数据包。
? RX-ERR/TX-ERR表示接收/发送数据包时产生了多少错误。
? RX-DRP/TX-DRP表示接收/发送数据包时丢弃了多少数据包。
? RX-OVR/TX-OVR表示由于误差而遗失了多少数据包。
? Flg表示接口标记,其中:
? L:表示该接口是个回环设备。
? B:表示设置了广播地址。
? M:表示接收所有数据包。
? R:表示接口正在运行。
? U:表示接口处于活动状态。
? O:表示在该接口上禁用arp。
? P:表示一个点到点的连接。
正常情况下,RX-ERR/TX-ERR、RX-DRP/TX-DRP和RX-OVR/TX-OVR的值都应该为0,如果这几个选项的值不为0,并且很大,那么网络质量肯定有问题,网络传输性能也一定会下降。
当网络传输存在问题是,可以检测网卡设备是否存在故障,如果可能,可以升级为千兆网卡或者光纤网络,还可以检查网络部署环境是否合理。
4.3 通过netstat –r组合检测系统的路由表信息
在网络不通,或者网络异常时,首先想到的就是检查系统的路由表信息,“netstat –r”的输出结果与route命令的输出完全相同,请看下面的一个实例:


点击(此处)折叠或打开
1.[root@webserver ~]# netstat -r
2.Kernel IP routing table
3.Destination Gateway Genmask Flags MSS Window irtt Iface
4.10.10.1.0 * 255.255.255.0 U 0 0 0 eth0
5.192.168.200.0 * 255.255.255.0 U 0 0 0 eth1
6.169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
7.default 10.10.1.254 0.0.0.0 UG 0 0 0 eth0

关于输出中每项的具体含义,已经在前面章节进行过详细介绍,这里不再多讲,这里我们重点关注的是default行对应的值,default项表示系统的默认路由,对应的网络接口为eth0。

4.4 通过sar –n组合显示系统的网络运行状态
sar提供四种不同的选项来显示网络统计信息,通过“-n”选项可以指定4个不同类型的开关:DEV、EDEV、SOCK和FULL。DEV显示网络接口信息,EDEV显示关于网络错误的统计数据,SOCK显示套接字信息,FULL显示所有三个开关。请看下面的一个输出:


点击(此处)折叠或打开
1.[root@webserver ~]# sar -n DEV 2 3
2.Linux 2.6.9-42.ELsmp (webserver) 12/01/2008 _i686_ (8 CPU)
3.02:22:31 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
4.02:22:33 PM lo 31.34 31.34 37.53 37.53 0.00 0.00 0.00
5.02:22:33 PM eth0 199.50 279.60 17.29 344.12 0.00 0.00 0.00
6.02:22:33 PM eth1 5.47 4.98 7.03 0.36 0.00 0.00 0.00
7.02:22:33 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
8.02:22:33 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
9.02:22:35 PM lo 67.66 67.66 74.34 74.34 0.00 0.00 0.00
10.02:22:35 PM eth0 159.70 222.39 19.74 217.16 0.00 0.00 0.00
11.02:22:35 PM eth1 3.48 4.48 0.44 0.51 0.00 0.00 0.00
12.02:22:35 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
13.02:22:35 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
14.02:22:37 PM lo 4.52 4.52 9.25 9.25 0.00 0.00 0.00
15.02:22:37 PM eth0 102.51 133.67 20.67 116.14 0.00 0.00 0.00
16.02:22:37 PM eth1 27.14 67.34 2.42 89.26 0.00 0.00 0.00
17.02:22:37 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
18.Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
19.Average: lo 34.61 34.61 40.48 40.48 0.00 0.00 0.00
20.Average: eth0 154.08 212.15 19.23 226.17 0.00 0.00 0.00
21.Average: eth1 11.98 25.46 3.30 29.85 0.00 0.00 0.00
22.Average: sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00

对上面每项的输出解释如下:
? IFACE表示网络接口设备。
? rxpck/s表示每秒钟接收的数据包大小。
? txpck/s表示每秒钟发送的数据包大小。
? rxkB/s表示每秒钟接收的字节数。
? txkB/s表示每秒钟发送的字节数。
? rxcmp/s表示每秒钟接收的压缩数据包。
? txcmp/s表示每秒钟发送的压缩数据包。
? rxmcst/s表示每秒钟接收的多播数据包。
通过“sar –n”的输出,可以清楚的显示网络接口发送、接收数据的统计信息。此外还可以通过“sar -n EDEV 2 3”来统计网络错误信息等。
4.5 小结
本节通过几个常用的网络命令介绍了对网络性能的评估,事实上,网络问题是简单而且容易处理的,只要我们根据上面给出的命令,一般都能迅速定位问题。解决问题的方法一般是增加网络带宽,或者优化网络部署环境。
除了上面介绍的几个命令外,排查网络问题经常用到的命令还有traceroute,主要用于跟踪数据包的传输路径,还有nslookup命令,主要用于判断DNS解析信息。

论坛徽章:
3
天秤座
日期:2013-12-27 13:44:58射手座
日期:2014-05-22 16:52:43天蝎座
日期:2014-08-13 16:03:21
50 [报告]
发表于 2014-05-27 11:11 |只看该作者
本帖最后由 compare2000 于 2014-05-28 11:09 编辑

reset命令有3种方式:


1.git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息

2.git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可

3.git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容




以下是一些reset的示例:

(1) 回退所有内容到上一个版本   
git reset HEAD^   
(2) 回退a.py这个文件的版本到上一个版本   
git reset HEAD^ a.py   
(3) 向前回退到第3个版本   
git reset –soft HEAD~3   
(4) 将本地的状态回退到和远程的一样   
git reset –hard origin/master   
(5) 回退到某个版本   
git reset 057d   
(7) 回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit   
git revert HEAD   



如果我们某次修改了某些内容,并且已经commit到本地仓库,而且已经push到远程仓库了


这种情况下,我们想把本地和远程仓库都回退到某个版本,该怎么做呢?


前面讲到的git reset只是在本地仓库中回退版本,而远程仓库的版本不会变化


这样,即时本地reset了,但如果再git pull,那么,远程仓库的内容又会和本地之前版本的内容进行merge


这并不是我们想要的东西,这时可以有2种办法来解决这个问题:


1.直接在远程server的仓库目录下,执行git reset –soft 10efa来回退。注意:在远程不能使用mixed或hard参数

2.在本地直接把远程的master分支给删除,然后再把reset后的分支内容给push上去,如下:
        (1)新建old_master分支做备份   
            git branch old_master   
        (2)push到远程   
            git push origin old_masterld_master   
        (3)本地仓库回退到某个版本   
             git reset –hard bae168   
        (4)删除远程的master分支   
             git push origin :master   
        (5)重新创建master分支   
           git push origin master   

在删除远程master分支时,可能会有问题,见下:

        $ git push origin :master  


        error: By default, deleting the current branch is denied, because the next   


        error: 'git clone' won't result in any file checked out, causing confusion.   


        error:   


         error: You can set 'receive.denyDeleteCurrent' configuration variable to   


         error: 'warn' or 'ignore' in the remote repository to allow deleting the   


         error: current branch, with or without a warning message.   


         error:   


         t">error: To squelch this message, you can set it to 'refuse'.   


        error: refusing to delete the current branch: refs/heads/master   


        To git@xx.sohu.com:gitosis_test   


        ! [remote rejected] master (deletion of the current branch prohibited)   


        error: failed to push some refs to 'git@xx.sohu.com:gitosis_test'   


这时需要在远程仓库目录下,设置git的receive.denyDeleteCurrent参数

git receive.denyDeleteCurrent warn   



然后,就可以删除远程的master分支了


虽然说有以上2种方法可以回退远程分支的版本,但这2种方式,都挺危险的,需要谨慎操作……





reference:http://blog.163.com/jianlizhao@1 ... 163201183045856216/

我们都是打tag,没那么做过,这个命令应该能做到repo forall -c 'HAHA=`git log --before="3 days" -1 --pretty=format:"%H"`;git reset --hard $HAHA'  

http://www.csdn.net/article/2014-05-27/2819954
很幸运自己能够在不同类型的单位工作过,也因此接触了很多不同背景、不同思维习惯、不同性格类型的人,积累了人脉,同时也丰富了自己的人生阅历。中小型私企是我职业生涯的第一步,我打下了坚实的基础,不仅仅是技术,更重要的是使自己的综合素质得到了提高。而大型外企的管理等各个方面相对比较正规,有一整套的流程,我懂得了如何带领和管理一个大型团队。而在事业单位,我学会了如何跟不同类型的人沟通交流。这些年以来,我渐渐感悟出一点对生活的理解:程序员不仅要关注自己所处领域的技术,更要关注我们所处的环境。技术可能不会做一辈子,锻炼自己的生存能力则是最现实的话题。
编程是个技术活,既然是技术活就需要不断的在实践当中加以练习。因为我之前自学过C语言,算是有一点基础,但是这与真正的软件开发还是有相当的差距。为了能够尽快的掌握C#开发,我买了很多相关的技术书籍。入门经典、高级编程之类的书都买了,一开始的时候就跟着上面一个一个例子不断在VS编译器中调试、运行,监控每一步值的变化,慢慢培养编程的感觉。掌握了C#语言之后,后来我喜欢做一些小工具之类练习,比如我的浏览器(Webbrowser)、记账单(单机版Access应用)等等。通过这些一个又一个的小工具开发练习,我慢慢的掌握了软件开发的技巧。更重要的是通过这些编程练习,我建立起了肯定能学好编程的信心,并从中找到了乐趣以及成就感
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP