Let's Go!

发布新日志

  • 使用 Strace 和 GDB 调试工具的乐趣

    2011-11-22 16:06:36



    UNIX 家族总是为用户提供了丰富的工具。UNIX 是一个工具财宝箱,有了这些工具,您不仅可以完成具有创造性的工作,还可以在深入研究该操作系统的同时得到教育和娱乐。strace(用来跟踪任何程序的 系统调用)和 GDB 调试工具(用来在受控的环境中运行程序的功能齐全的调试工具)是实现这个目标的两个有价值的工具。

    UNIX 的设计由大量的函数调用(称为系统调用)组成,其中包括一些简单的任务,如在屏幕上显示字符串来设置任务优先级。所 有的 UNIX 程序都是通过调用操作系统提供的这些底层服务来完成它们的任务,使用 strace 工具,您可以清楚地看到这些调用过程及其使用的参数。通过这种方式,您可以操作这些程序,以了解它们与操作系统之间的底层交互。

    开始游戏

    让我们以一个简单的 UNIX 命令 pwd 作为开始,然后更深入地研究该命令在完成其任务的过程中进行了哪些工作。启动 xterm 以创建一个进行实验的受控环境,然后输入下面的命令:

    $ pwd
    

    这个 pwd 命令显示了当前的工作目录。在我的计算机上,当时的输出是:

    /home/bill/
    

    一个如此简单的函数掩饰了该命令底层的复杂性(顺便说一下,所有的计算机程序都是这样的)。要真正地了解其复杂性,请使用 strace 工具再次运行 pwd 命令:

    $ strace pwd
    

    通过该命令,您可以看到,在显示和列举当前工作目录的过程中,UNIX 计算机执行了相当多的操作(请参见清单 1)。


    清单 1:strace pwd 命令的输出
    execve("/bin/pwd", ["pwd"], [/* 39 vars */]) = 0
    uname({sys="Linux", node="sammy", ...}) = 0
    brk(0)                                  = 0x804c000
    old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4001...
    	.
    	.
    	.
    	fstat64(3, {st_mode=S_IFREG|0644, st_size=115031, ...}) = 0
    old_mmap(NULL, 115031, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40017000
    close(3)                                = 0
    open("/lib/tls/libc.so.6", O_RDONLY)    = 3
    read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\360U\1"..., 1024) = 1024
    fstat64(3, {st_mode=S_IFREG|0755, st_size=1547996, ...}) = 0
    old_mmap(0x42000000, 1257224, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x42000000
    mprotect(0x4212e000, 20232, PROT_NONE)  = 0
    old_mmap(0x4212e000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x12e000)...
    old_mmap(0x42131000, 7944, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS,...
    close(3)                                = 0
    set_thread_area({entry_number:-1 -> 6, base_addr:0x40016ac0, limit:1048575, seg_32bit...
    munmap(0x40017000, 115031)              = 0
    brk(0)                                  = 0x804c000
    brk(0x804d000)                          = 0x804d000
    brk(0)                                  = 0x804d000
    open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
    fstat64(3, {st_mode=S_IFREG|0644, st_size=30301680, ...}) = 0
    mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40017000
    close(3)                                = 0
    brk(0)                                  = 0x804d000
    brk(0x804e000)                          = 0x804e000
    getcwd("/home/bill", 4096)              = 11
    fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 6), ...}) = 0
    mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4021700...
    write(1, "/home/bill\n", 11/home/bill
    )            = 11
    munmap(0x40217000, 4096)                = 0
    exit_group(0)                           = ?
    

    UNIX 系统调用的具体细节

    关于检索和显示当前工作目录所需的所有系统调用的详细细节,已经超出了本文的讨论范围,但我会介绍如何获取这些信息。清单 1 中的每一行都以类似 C 的格式,清楚地说明了一项系统调用及其参数,这也是 C 程序员希望看到的。Strace 同样以这种方式显示这些调用,不管在实际创建该程序时使用的是何种编程语言。

    如果要了解清单 1 中的所有细节信息,对于所有这些系统调用,UNIX 为您提供了大量的文档。清单 1 中“最重要”的函数是 getcwd() 函数,它表示获取当前工作目录。当前的 xterm 显示了 strace pwd 的输出,同时再启动另一个 xterm 并输入下面的命令以查看 UNIX 对该函数的显示:

    $ man getcwd
    

    您所看到的应该是 getcwd() 函数完整的清单以及这个重要的 C 函数需要的和返回的参数清单。同样地,您可以输入 man brkman fstat64 等等。通常,UNIX 系统通过文档对这些系统函数进行了详细的说明,如果花些时间仔细地研究它们,您将逐渐地了解到 UNIX 的功能是多么的强大,以及学习这些底层系统细节是多么的容易。在所有的操作系统中,UNIX 最善于帮助您理解其底层的处理过程。

    观察 nweb

    对于下面几个步骤,您需要使用更庞大且更复杂的程序,而不是像 pwd 这样简单的 UNIX 命令。简单的超文本传输协议 (HTTP) 服务器,如 nweb,是非常适合的。当您在 Internet 上冲浪 的时候,HTTP 服务器侦听浏览器请求,然后通过发送所请求的对象,如 Web 页面和图形文件,以此响应浏览器的请求。

    下载并安装 nweb,该软件由 IBM developerWorks 投稿作家 Nigel Griffiths 编写。 '"(请参阅参考资料部分提供的 Nigel 的文章“nweb: ?"a tiny, safe Web server (static pages only)”(developerWorks,2004 年 6 月)的链接。)

    下载 es-nweb.zip 到 $HOME/downloads 目录,然后输入清单 2 中所示的简单命令,以提取、编译并启动该程序:

    注意:我假设您需要为 Linux® 工作站编译这个程序。如果实际情况并非如此,那么有关在其他的 UNIX 操作系统上对该程序进行编译的详细信息,请阅读这篇 nweb 文章。


    清单 2. 用于提取、编译和启动 nweb 的命令
    $ cd src
    $ mkdir nweb
    $ cd nweb
    $ unzip $HOME/downloads/es-nweb.zip
    $ gcc -ggdb -O -DLINUX nweb.c -o nweb
    $ ./nweb 9090 $HOME/src/nweb &
    

    注意:清单 2 中的 -ggdb 选项和 Nigel 的文章中的内容有些不同,该选项用于告诉 GCC 编译器对该程序进行优化,以便使用 GDB 调试工具对其进行调试,您将在以后用到该调试工具。

    接下来,要确认 nweb 服务器已经运行,可以使用清单 3 中所示的 ps 命令来对它进行检查。


    清单 3. ps 命令
    $ ps
      PID TTY          TIME CMD
     2913 pts/5    00:00:00 bash
     4009 pts/5    00:00:00 nweb
     4011 pts/5    00:00:00 ps
    

    最后,要确认 nweb 确实正在运行并且状态正常,可以在您的计算机上启动一个 Web 浏览器并在地址栏中输入 http://localhost:9090

    针对 nweb 使用 strace

    现在,让我们来进行一些有趣的工作。启动另一个 xterm,然后使用 strace 来跟踪正在运行的 nweb 服务器。要完成该任务,您必须清楚该程序的进程 ID,并且必须具有适当的权限。您仅仅可以看到一组特定的系统调用,即那些与网络相关的系统调用。输入清单 4 第一行所示的命令作为开始,其中使用了前面显示的 nweb 的进程 ID。您应该看到如下的输出(清单 4 中的第二行)。


    清单 4. 开始对 nweb 进行跟踪
    $ strace -e trace=network -p 4009
    accept(0,
    

    请注意,在调用网络 accept() 函数的过程中停止了跟踪操作。在浏览器中刷新几次 http://localhost:9090 页面,请注意每次刷新该页面时 strace 的显示。这是不是很棒呢?您所看到的是,当 Web 浏览器调用 HTTP 服务器 (nweb) 时,服务器所进行的底层网络调用。简单地说,nweb 正在接受 来自您的浏览器的调用。

    您可以在运行 strace 的具有窗口焦点的 xterm 中按下 Ctrl+C 以停止对网络调用的跟踪。

    再来研究 GDB 调试工具

    正如您所看到的,strace 可以作为了解用户程序如何通过某些系统调用与操作系统进行交互的一个很好的程序。GDB 调试工具本身也可以附加于一个正在运行的进程,并帮助您进行更深入的研究。

    GDB 调试工具非常有用,Internet 上提供了大量的有关该工具的可用信息。通常,调试工具是很有价值的工具,并且任何负责开发和维护计算机系统的人员应该了解如何使用它们。因此,在 nweb 运行于另一个 xterm 会话的同时,按下 Ctrl+C 停止 strace,然后输入清单 5 中所示的命令启动 GDB 调试工具。


    清单 5. 启动 GDB 调试工具
    $ gdb --quiet
    (gdb) attach 4009
    Attaching to process 4009
    Reading symbols from /home/bill/src/nweb/nweb...done.
    Reading symbols from /lib/tls/libc.so.6...done.
    Loaded symbols for /lib/tls/libc.so.6
    Reading symbols from /lib/ld-linux.so.2...done.
    Loaded symbols for /lib/ld-linux.so.2
    0xffffe410 in ?? ()
    (gdb)
    

    -quiet 选项告诉 GDB 调试工具仅显示其提示符,而不要显示所有其他的启动信息。如果需要显示额外的文本信息,可以去掉 -quiet 选项。

    attach 4009 命令启动对当前正在运行的 nweb 服务器的调试工作,并且 GDB 调试工具通过读取有关该进程的所有的符号信息来做出同样方式的响应。下一步,使用 info 命令来列举您所研究的程序的相关信息(请参见清单 6)。


    清单 6. info 命令列出程序信息
    (gdb) info proc
    process 4009
    cmdline = './nweb'
    cwd = '/home/bill/src/nweb'
    exe = '/home/bill/src/nweb/nweb'
    (gdb)
    

    info 命令(请参见清单 7)的另一个有用的变种是 info functions,然而,函数的列表可能很长。


    清单 7. info functions 命令得到的函数列表
    (gdb) info functions
    All defined functions:
    
    File nweb.c:
    void log(int, char *, char *, int);
    int main(int, char **);
    void web(int, int);
    
    File __finite:
    int __finite();
    	.
    	.
    	.
    (gdb)	
    

    因为使用 -ggdb 选项对 nweb 程序进行了编译,所以可执行文件中包含了大量的调试信息,允许该调试工具查看文件中列举的已定义的函数,如清单 7 所示。

    list 和 disassemble 命令

    有两个重要的 GDB 调试工具命令,它们分别是 listdisassemble。通过使用清单 8 中所示的代码尝试使用这些命令。


    清单 8. list 命令
    (gdb) list main
    121             exit(1);
    122     }
    123
    124
    125     main(int argc, char **argv)
    126     {
    127             int i, port, pid, listenfd, socketfd, hit;
    128             size_t length;
    129             char *str;
    130             static struct sockaddr_in cli_addr; /* static = initialised to zeros */
    (gdb) 
    131             static struct sockaddr_in serv_addr; /* static = initialised to zeros */
    132
    133             if( argc < 3  || argc > 3 || !strcmp(argv[1], "-?") ) {
    134                     (void)printf("hint: nweb Port-Number Top-Directory\n\n"
    135             "\tnweb is a small and very safe mini web server\n"
    136             "\tnweb only servers out file/web pages with extensions named below\n"
    137             "\t and only from the named directory or its sub-directories.\n"
    138             "\tThere is no fancy features = safe and secure.\n\n"
    139             "\tExample: nweb 8181 /home/nwebdir &\n\n"
    140             "\tOnly Supports:");
    

    正如您所看到的,list 命令以源文件的形式列出了正在运行的程序,并标注了相应的行号。按下 Return 键(如第 130 行和第 131 行之间所示)以接着上次的列表继续进行列举。现在,尝试使用 disassemble 命令,可以缩写为 disass(请参见清单 9)。


    清单 9. disassemble 命令
    (gdb) disass main
    Dump of assembler code for function main:
    0x08048ba2 <main+0>:    push   ebp
    0x08048ba3 <main+1>:    mov    ebp,esp
    0x08048ba5 <main+3>:    push   edi
    0x08048ba6 <main+4>:    push   esi
    0x08048ba7 <main+5>:    push   ebx
    0x08048ba8 <main+6>:    sub    esp,0xc
    0x08048bab <main+9>:    mov    ebx,DWORD PTR [ebp+12]
    0x08048bae <main+12>:   and    esp,0xfffffff0
    	.
    	.
    	.
    0x08048c01 <main+95>:   call   0x8048664 <printf>
    0x08048c06 <main+100>:  add    esp,0x10
    0x08048c09 <main+103>:  inc    esi
    0x08048c0a <main+104>:  cmp    DWORD PTR [ebx+esi],0x0
    ---Type <return> to continue, or q <return> to quit---
    

    反汇编清单显示了该 main 函数的汇编语言清单。在本示例中,汇编代码指示出运行该代码的计算机使用的是 Intel® Pentium® 处理器。如果该程序运行于不同类型的处理器上,如基于 IBM Power PC® 的计算机,那么您的代码看上去将有很大的区别。

    在其运行的过程中进行监视

    因为您所监视的是一个正在运行的程序,所以可以设置相应的断点,然后在它响应浏览器请求并向提出请求的浏览器传输 .html 和 .jpg 文件的同时,对该程序进行监视清单 10 介绍了如何完成该任务。


    清单 10. 设置断点
    (gdb) break 188
    Breakpoint 1 at 0x8048e70: file nweb.c, line 188.
    (gdb) commands 1
    Type commands for when breakpoint 1 is hit, one per line.
    End with a line saying just "end".
    >continue
    >end
    (gdb) c
    Continuing.
    

    此时,GDB 调试工具已设置为在 nweb 服务器接受 浏览器请求处进行中断,该调试工具将仅仅显示相应的请求并继续处理其他的请求,而不会中断正在运行的程序。刷新几次浏览器中的 http://localhost:9090/ 页面,可以观察到,GDB 调试工具显示了断点并继续运行。

    在刷新浏览器页面的同时,您应该看到如清单 11 所示的断点信息,在 GDB 调试工具 xterm 中滚动输出。与 strace 相同,您可以按下 Ctrl+C 来停止对 nweb 服务器的调试。在停止了跟踪操作之后,您可以输入 quit 命令以退出 GDB 调试工具。


    清单 11. GDB 调试工具 xterm 中的断点信息
    Breakpoint 1, main (argc=3, argv=0x1) at nweb.c:188
    188 if((socketfd = accept(listenfd, (struct sockaddr *)&cli_addr, &length)) < 0)
    Breakpoint 1, main (argc=3, argv=0x1) at nweb.c:188
    188 if((socketfd = accept(listenfd, (struct sockaddr *)&cli_addr, &length)) < 0)
    Breakpoint 1, main (argc=3, argv=0x1) at nweb.c:188
    188 if((socketfd = accept(listenfd, (struct sockaddr *)&cli_addr, &length)) < 0)
    Breakpoint 1, main (argc=3, argv=0x1) at nweb.c:188
    188 if((socketfd = accept(listenfd, (struct sockaddr *)&cli_addr, &length)) < 0)
    Program received signal SIGINT, Interrupt.
    0xffffe410 in ?? ()
    (gdb) quit
    The program is running.  Quit anyway (and detach it)? (y or n) y
    Detaching from program: /home/bill/src/nweb/nweb, process 4009
    $
    

    请注意,您正告诉 GDB 调试工具停止对一个仍在内存中活动的程序的调试。即使是在退出了调试工具之后,您还可以刷新浏览器页面,并将看到 nweb 仍在运行。可以输入 kill 4009 命令来停止该程序,或者在您退出会话时,该页面将会消失。

    和平常一样,您可以通过其 man 和 info 页面来了解各种各样的工具,如 strace 和 GDB 调试工具。请确保使用 UNIX 为您提供的这些工具!

    了解尽可能多的信息

    了解关于您所使用的计算机的尽可能多的信息,绝不是件坏事,并且还可以从这个过程中获得乐趣。实际上,UNIX 通过提供各种工具,如 strace 和 GDB 调试工具以及包含在相应的 man 和 info 页面中的大量的信息,鼓励您对系统进行研究和学习。计算机是人类智慧的延伸,并且我们对其了解得越多,它们将变得越有用。


    转自:http://www.ibm.com/developerworks/cn/aix/library/au-unix-strace.html

  • Java 内存泄露监控工具 -- JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta

    2011-11-10 19:02:52

    jstack -- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到 当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。

     

    jconsole – jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。

     

    jinfo – jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面才有。

     

    jmap – jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等,目前只有在Solaris和Linux的JDK版本里面才有。

     

    jdb – jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。

     

    jstat – jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控等等。

     

    jps – jps是用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。

     



    推荐:

    jconsole

    jstat



    jmap(linux下特有,也是很常用的一个命令)
    观察运行中的jvm物理内存的占用情况。
    参数如下:
    -heap:打印jvm heap的情况
    -histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
    -histo:live :同上,但是只答应存活对象的情况
    -permstat:打印permanent generation heap情况

    命令使用:
    jmap -heap 2083
    可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况
    输出内容:
     



    jmap -histo 2083 | jmap -histo:live 2083
    可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。
    输出内容:
     


    写个脚本,可以很快把占用heap最大的对象找出来,对付内存泄漏特别有效。







    [root@tc130 bin]# jmap -heap 8208
    Attaching to process ID 8208, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 19.1-b02

    using parallel threads in the new generation.
    using thread-local object allocation.
    Concurrent Mark-Sweep GC

    Heap Configuration:
       MinHeapFreeRatio = 40
       MaxHeapFreeRatio = 70
       MaxHeapSize      = 2147483648 (2048.0MB)
       NewSize          = 268435456 (256.0MB)
       MaxNewSize       = 268435456 (256.0MB)
       OldSize          = 5439488 (5.1875MB)
       NewRatio         = 2
       SurvivorRatio    = 5
       PermSize         = 21757952 (20.75MB)
       MaxPermSize      = 85983232 (82.0MB)

    Heap Usage:
    New Generation (Eden + 1 Survivor Space):           ========>  (= Eden Space + From Space)
       capacity = 230096896 (219.4375MB)
       used     = 97320504 (92.81206512451172MB)
       free     = 132776392 (126.62543487548828MB)
       42.29544408978033% used
    Eden Space:                                        =======> Eden Space (heap): 内存最初从这个内存池分配给大部分对象。
       capacity = 191758336 (182.875MB)
       used     = 86089392 (82.10124206542969MB)
       free     = 105668944 (100.77375793457031MB)
       44.894732503310834% used
    From Space:                                        ========> Survivor Space (heap):用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。
       capacity = 38338560 (36.5625MB)
       used     = 11231112 (10.710823059082031MB)
       free     = 27107448 (25.85167694091797MB)
       29.294558794070515% used
    To Space:                                          ========>  另一个Survivor Space (heap)
       capacity = 38338560 (36.5625MB)
       used     = 0 (0.0MB)
       free     = 38338560 (36.5625MB)
       0.0% used
    concurrent mark-sweep generation:                 ========>   Old/Tenured Generation (heap):用于保持已经在 survivor space内存池中存在了一段时间的对象。
       capacity = 1879048192 (1792.0MB)
       used     = 1112082360 (1060.5643844604492MB)
       free     = 766965832 (731.4356155395508MB)
       59.183280382837566% used
    Perm Generation:                                  ========> Permanent Generation (non-heap):  保存虚拟机自己的静态(refective)数据,例如类(class)
                                                                  和方法(method)对象。  Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的,
       capacity = 75022336 (71.546875MB)
       used     = 44927840 (42.846527099609375MB)
       free     = 30094496 (28.700347900390625MB)
       59.885951831731816% used


    这里的数值和JConsole的数值做比较,是相符的,具体见JConsole的"内存"标签。


    还有:
    Code Cache (non-heap):HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)




    全部内容详见附件: Java_内存泄露监控工具.rar(1.65 MB)
  • 修改linux文件描述符限制

    2011-11-10 18:57:05


    修改linux文件描述符限制

       Linux管理用户可以在etc/security/limits.conf配置文件中设置他们的文件描述符极限,如下例所示。  
     softnofile 1024   
      hardnofile 4096   
    系统级文件描述符极限还可以通过将以下三行添加到/etc/rc.d/rc.local启动脚本中来设置:  
     #Increasesystem-widefiledescriptorlimit.  
     echo4096>/proc/sys/fs/file-max  
     echo16384>/proc/sys/fs/inode-max

    参考文档:
    http://baike.baidu.com/view/1303430.htm
    http://www.blogjava.net/alexwan/archive/2009/05/18/271269.html




    文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix 操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix 通常有一个系统级的限制。
     
    查看命令:
            ulimit -n
            在修改之前一般得到的结果是1024;
           
     临时修改:
            ulimit -HSn 65536
            这样就增大了文件描述符的限制。

     持久性修改有两种方法:
    (1)将ulimit -HSn 65536写入对应用户的.bash_profile文件中,如/root/.bash_profile;
    (2)将ulimit -HSn 65536写入到/etc/profile文件中,那么这个设置就对所有用户有效;

    这样在下次进入系统是就不用再设置了。
    上面这个方法对解决too many open file的错误很有效。

    PS:如果你的进程是通过脚本启动的,当然也可以将
    ulimit -HSn 65536
    写到脚本文件中。
           


    Let life be beautiful like summer flowers and death like autumn leaves.



  • dmesg 命令

    2011-11-10 18:51:53


    dmesg:

       说明
    Linux命令dmesg用来显示开机信息,kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,
    可利用dmesg来查看。开机信息亦保存在/var/log目录中,名称为dmesg的文件里


    示例
      将系统启动信息保存到文件中:   
        $ sudo dmesg > messages.txt  
         
        打印输出最近一次的信息:   
        $ sudo dmesg | tail -f





    $ dmesg
    Linux version 2.6.18-164.el5PAE (mockbuild@builder16.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Thu Sep 3 04:10:44 EDT 2009
    BIOS-provided physical RAM map:
     BIOS-e820: 0000000000010000 - 000000000009f000 (usable)
     BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved)
     BIOS-e820: 00000000000e8000 - 0000000000100000 (reserved)
     BIOS-e820: 0000000000100000 - 000000003fff0000 (usable)
     BIOS-e820: 000000003fff0000 - 0000000040000000 (ACPI data)
     BIOS-e820: 00000000c0000000 - 00000000c1000000 (reserved)
     BIOS-e820: 00000000fffbc000 - 0000000100000000 (reserved)
    127MB HIGHMEM available.
    896MB LOWMEM available.
    found SMP MP-table at 000fbd60
    Memory for crash kernel (0x0 to 0x0) notwithin permissible range
    disabling kdump
    NX (Execute Disable) protection: active
    On node 0 totalpages: 262128
      DMA zone: 4096 pages, LIFO batch:0
      Normal zone: 225280 pages, LIFO batch:31
      HighMem zone: 32752 pages, LIFO batch:7
    DMI 2.4 present.
    Using APIC driver default
    ACPI: RSDP (v000 QEMU                                  ) @ 0x000fbeb0
    ACPI: RSDT (v001 QEMU   QEMURSDT 0x00000001 QEMU 0x00000001) @ 0x3fff0000
    ACPI: FADT (v001 QEMU   QEMUFACP 0x00000001 QEMU 0x00000001) @ 0x3fff002c
    ACPI: MADT (v001 QEMU   QEMUAPIC 0x00000001 QEMU 0x00000001) @ 0x3fff2640
    ACPI: DSDT (v001   BXPC   BXDSDT 0x00000001 INTL 0x20061109) @ 0x00000000
    ACPI: PM-Timer IO Port: 0xb008
    ACPI: Local APIC address 0xfee00000
    ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
    Processor #0 6:6 APIC version 20
    ACPI: LAPIC (acpi_id[0x01] lapic_id[0x01] disabled)
    ACPI: LAPIC (acpi_id[0x02] lapic_id[0x02] disabled)
    ACPI: LAPIC (acpi_id[0x03] lapic_id[0x03] disabled)
    ACPI: LAPIC (acpi_id[0x04] lapic_id[0x04] disabled)
    ACPI: LAPIC (acpi_id[0x05] lapic_id[0x05] disabled)
    ACPI: LAPIC (acpi_id[0x06] lapic_id[0x06] disabled)
    ACPI: LAPIC (acpi_id[0x07] lapic_id[0x07] disabled)
    ACPI: LAPIC (acpi_id[0x08] lapic_id[0x08] disabled)
    ACPI: LAPIC (acpi_id[0x09] lapic_id[0x09] disabled)
    ACPI: LAPIC (acpi_id[0x0a] lapic_id[0x0a] disabled)
    ACPI: LAPIC (acpi_id[0x0b] lapic_id[0x0b] disabled)
    ACPI: LAPIC (acpi_id[0x0c] lapic_id[0x0c] disabled)
    ACPI: LAPIC (acpi_id[0x0d] lapic_id[0x0d] disabled)
    ACPI: LAPIC (acpi_id[0x0e] lapic_id[0x0e] disabled)
    ACPI: LAPIC (acpi_id[0x0f] lapic_id[0x0f] disabled)
    ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0])
    IOAPIC[0]: apic_id 1, version 17, address 0xfec00000, GSI 0-23
    ACPI: INT_SRC_OVR (bus 0 bus_irq 5 global_irq 5 high level)
    ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
    ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 high level)
    ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 high level)
    ACPI: IRQ5 used by override.
    ACPI: IRQ9 used by override.
    ACPI: IRQ10 used by override.
    ACPI: IRQ11 used by override.
    Enabling APIC mode:  Flat.  Using 1 I/O APICs
    Using ACPI (MADT) for SMP configuration information
    Allocating PCI resources starting at 48000000 (gap: 40000000:80000000)
    kvm_get_tsc_khz: cpu 0, msr 0:1804001
    TSC: Frequency read from the hypervisor
    Detected 2261.056 MHz processor.
    Built 1 zonelists.  Total pages: 262128
    Kernel command line: ro root=LABEL=/
    mapped APIC to ffffd000 (fee00000)
    mapped IOAPIC to ffffc000 (fec00000)
    Enabling fast FPU save and restore... done.
    Enabling unmasked SIMD FPU exception support... done.
    Initializing CPU#0
    CPU 0 irqstacks, hard=c075d000 soft=c073d000
    PID hash table entries: 4096 (order: 12, 16384 bytes)
    Console: colour VGA+ 80x25
    Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
    Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
    Memory: 1032072k/1048512k available (2151k kernel code, 15632k reserved, 886k data, 232k init, 131008k highmem)
    Checking if this processor honours the WP bit even in supervisor mode... Ok.
    Calibrating delay loop (skipped), value calculated using timer frequency.. 4522.11 BogoMIPS (lpj=2261056)
    Security Framework v1.0.0 initialized
    SELinux:  Initializing.
    SELinux:  Starting in permissive mode
    selinux_register_security:  Registering secondary module capability
    Capability LSM initialized as secondary
    Mount-cache hash table entries: 512
    CPU: After generic identify, caps: 078bfbfd 2191abfd 00000000 00000000 80000001 00000000 00000000
    CPU: After vendor identify, caps: 078bfbfd 2191abfd 00000000 00000000 80000001 00000000 00000000
    CPU: L1 I cache: 32K, L1 D cache: 32K
    CPU: L2 cache: 2048K
    CPU: After all inits, caps: 078bfbfd 2191abfd 00000000 00000040 80000001 00000000 00000000
    Intel machine check architecture supported.
    Intel machine check reporting enabled on CPU#0.
    Checking 'hlt' instruction... OK.
    SMP alternatives: switching to UP code
    Freeing SMP alternatives: 14k freed
    ACPI: Core revision 20060707
    CPU0: Intel QEMU Virtual CPU version 0.9.1 stepping 03
    Total of 1 processors activated (4522.11 BogoMIPS).
    ENABLING IO-APIC IRQs
    ..TIMER: vector=0x31 apic1=0 pin1=0 apic2=-1 pin2=-1
    Brought up 1 CPUs
    sizeof(vma)=88 bytes
    sizeof(page)=32 bytes
    sizeof(inode)=340 bytes
    sizeof(dentry)=136 bytes
    sizeof(ext3inode)=492 bytes
    sizeof(buffer_head)=52 bytes
    sizeof(skbuff)=176 bytes
    checking if image is initramfs... it is
    Freeing initrd memory: 2484k freed
    NET: Registered protocol family 16
    ACPI: bus type pci registered
    PCI: PCI BIOS revision 2.10 entry at 0xfb560, last bus=0
    PCI: Using configuration type 1
    Setting up standard PCI resources
    ACPI: Interpreter enabled
    ACPI: Using IOAPIC for interrupt routing
    ACPI: No dock devices found.
    ACPI: PCI Root Bridge [PCI0] (0000:00)
    PCI quirk: region b000-b03f claimed by PIIX4 ACPI
    PCI quirk: region b100-b10f claimed by PIIX4 SMB
    ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
    ACPI: PCI Interrupt Link [LNKA] (IRQs 5 *10 11)
    ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
    ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
    ACPI: PCI Interrupt Link [LNKD] (IRQs 5 10 *11)
    Linux Plug and Play Support v0.97 (c) Adam Belay
    pnp: PnP ACPI init
    pnp: PnP ACPI: found 5 devices
    usbcore: registered new driver usbfs
    usbcore: registered new driver hub
    PCI: Using ACPI for IRQ routing
    PCI: If a device doesn't work, try "pci=routeirq".  If it helps, post a report
    NetLabel: Initializing
    NetLabel:  domain hash size = 128
    NetLabel:  protocols = UNLABELED CIPSOv4
    NetLabel:  unlabeled traffic allowed by default
    NET: Registered protocol family 2
    IP route cache hash table entries: 32768 (order: 5, 131072 bytes)
    TCP established hash table entries: 131072 (order: 8, 1048576 bytes)
    TCP bind hash table entries: 65536 (order: 7, 524288 bytes)
    TCP: Hash tables configured (established 131072 bind 65536)
    TCP reno registered
    apm: BIOS version 1.2 Flags 0x03 (Driver version 1.16ac)
    apm: overridden by ACPI.
    audit: initializing netlink socket (disabled)
    type=2000 audit(1309797068.772:1): initialized
    highmem bounce pool size: 64 pages
    Total HugeTLB memory allocated, 0
    VFS: Disk quotas dquot_6.5.1
    Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
    SELinux:  Registering netfilter hooks
    Initializing Cryptographic API
    alg: No test for crc32c (crc32c-generic)
    ksign: Installing public key data
    Loading keyring
    - Added public key 581431131FF6A527
    - User ID: CentOS (Kernel Module GPG key)
    io scheduler noop registered
    io scheduler anticipatory registered
    io scheduler deadline registered
    io scheduler cfq registered (default)
    Limiting direct PCI/PCI transfers.
    Activating ISA DMA hang workarounds.
    Boot video device is 0000:00:02.0
    pci_hotplug: PCI Hot Plug PCI Core version: 0.5
    Real Time Clock Driver v1.12ac
    Non-volatile memory driver v1.2
    Linux agpgart interface v0.101 (c) Dave Jones
    Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled
    brd: module loaded
    Uniform. Multi-Platform. E-IDE driver Revision: 7.00alpha2
    ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
    PIIX3: IDE controller at PCI slot 0000:00:01.1
    PIIX3: chipset revision 0
    PIIX3: not 100% native mode: will probe irqs later
        ide0: BM-DMA at 0xc000-0xc007, BIOS settings: hda:pio, hdb:pio
        ide1: BM-DMA at 0xc008-0xc00f, BIOS settings: hdc:DMA, hdd:pio
    Probing IDE interface ide0...
    hda: QEMU HARDDISK, ATA DISK drive
    hdb: QEMU HARDDISK, ATA DISK drive
    ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
    Probing IDE interface ide1...
    hdc: QEMU HARDDISK, ATA DISK drive
    ide1 at 0x170-0x177,0x376 on irq 15
    hda: max request size: 512KiB
    hda: 16384000 sectors (8388 MB) w/256KiB Cache, CHS=16253/255/63, (U)DMA
    hda: cache flushes supported
     hda: hda1
    hdb: max request size: 512KiB
    hdb: 83886080 sectors (42949 MB) w/256KiB Cache, CHS=16383/255/63, (U)DMA
    hdb: cache flushes supported
     hdb: unknown partition table
    hdc: max request size: 512KiB
    hdc: 4194304 sectors (2147 MB) w/256KiB Cache, CHS=4161/255/63, (U)DMA
    hdc: cache flushes supported
     hdc: unknown partition table
    ide-floppy driver 0.99.newide
    usbcore: registered new driver hiddev
    usbcore: registered new driver usbhid
    drivers/usb/input/hid-core.c: v2.6:USB HID core driver
    PNP: PS/2 Controller [PNP0303:KBD,PNP0f13:MOU] at 0x60,0x64 irq 1,12
    serio: i8042 KBD port at 0x60,0x64 irq 1
    serio: i8042 AUX port at 0x60,0x64 irq 12
    mice: PS/2 mouse device common for all mice
    md: md driver 0.90.3 MAX_MD_DEVS=256, MD_SB_DISKS=27
    md: bitmap version 4.39
    TCP bic registered
    Initializing IPsec netlink socket
    NET: Registered protocol family 1
    NET: Registered protocol family 17
    Using IPI No-Shortcut mode
    ACPI: (supports<6>Time: tsc clocksource has been installed.
     S3 S4 S5)
    Initalizing network drop monitor service
    Freeing unused kernel memory: 232k freed
    Write protecting the kernel read-only data: 403k
    input: AT Translated Set 2 keyboard as /class/input/input0
    input: ImExPS/2 Generic Explorer Mouse as /class/input/input1
    ohci_hcd: 2005 April 22 USB 1.1 'Open' Host Controller (OHCI) Driver (PCI)
    USB Universal Host Controller Interface driver v3.0
    ACPI: PCI Interrupt Link [LNKD] enabled at IRQ 11
    ACPI: PCI Interrupt 0000:00:01.2[D] -> Link [LNKD] -> GSI 11 (level, high) -> IRQ 11
    uhci_hcd 0000:00:01.2: UHCI Host Controller
    uhci_hcd 0000:00:01.2: new USB bus registered, assigned bus number 1
    uhci_hcd 0000:00:01.2: irq 11, io base 0x0000c020
    usb usb1: configuration #1 chosen from 1 choice
    hub 1-0:1.0: USB hub found
    hub 1-0:1.0: 2 ports detected
    SCSI subsystem initialized
    libata version 3.00 loaded.
    device-mapper: uevent: version 1.0.3
    device-mapper: ioctl: 4.11.5-ioctl (2007-12-12) initialised: dm-devel@redhat.com
    device-mapper: dm-raid45: initialized v0.2594l
    ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 10
    ACPI: PCI Interrupt 0000:00:03.0[A] -> Link [LNKC] -> GSI 10 (level, high) -> IRQ 10
    ACPI: PCI Interrupt 0000:00:04.0[A] -> Link [LNKD] -> GSI 11 (level, high) -> IRQ 11
    kjournald starting.  Commit interval 5 seconds
    EXT3-fs: mounted filesystem with ordered data mode.
    SELinux:  Disabled at runtime.
    SELinux:  Unregistering netfilter hooks
    type=1404 audit(1309797094.409:2): selinux=0 auid=4294967295 ses=4294967295
    piix4_smbus 0000:00:01.3: Found 0000:00:01.3 device
    input: PC Speaker as /class/input/input2
    FDC 0 is a S82078B
    lp: driver loaded but no devices found
    ACPI: Power Button (FF) [PWRF]
    md: Autodetecting RAID arrays.
    md: autorun ...
    md: ... autorun DONE.
    device-mapper: multipath: version 1.0.5 loaded
    EXT3 FS on hda1, internal journal
    kjournald starting.  Commit interval 5 seconds
    EXT3 FS on hdb, internal journal
    EXT3-fs: mounted filesystem with ordered data mode.
    Adding 2097144k swap on /dev/hdc.  Priority:-1 extents:1 across:2097144k
    IA-32 Microcode Update Driver: v1.14a <tigran@veritas.com>
    NET: Registered protocol family 10
    lo: Disabled Privacy Extensions
    IPv6 over IPv4 tunneling driver
    Bluetooth: Core ver 2.10
    NET: Registered protocol family 31
    Bluetooth: HCI device and connection manager initialized
    Bluetooth: HCI socket layer initialized
    Bluetooth: L2CAP ver 2.8
    Bluetooth: L2CAP socket layer initialized
    Bluetooth: RFCOMM socket layer initialized
    Bluetooth: RFCOMM TTY layer initialized
    Bluetooth: RFCOMM ver 1.8
    Bluetooth: HIDP (Human Interface Emulation) ver 1.1
    eth0: no IPv6 routers present
    hda: dma_timer_expiry: dma status == 0x61
    hda: dma_timer_expiry: dma status == 0x61
    hda: DMA timeout error
    hda: dma timeout error: status=0x50 { DriveReady SeekComplete }
    ide: failed opcode was: unknown
    hda: dma_timer_expiry: dma status == 0x61
    hda: DMA timeout error
    hda: dma timeout error: status=0x50 { DriveReady SeekComplete }
    ide: failed opcode was: unknown
    hdb: dma_timer_expiry: dma status == 0x61
    hdb: DMA timeout error
    hdb: dma timeout error: status=0x50 { DriveReady SeekComplete }
    ide: failed opcode was: unknown
    hda: dma_timer_expiry: dma status == 0x61
    hda: DMA timeout error
    hda: dma timeout error: status=0x50 { DriveReady SeekComplete }
    ide: failed opcode was: unknown
    hdb: dma_timer_expiry: dma status == 0x61
    hdb: DMA timeout error
    hdb: dma timeout error: status=0x50 { DriveReady SeekComplete }
    ide: failed opcode was: unknown
    hda: dma_timer_expiry: dma status == 0x61
    hda: DMA timeout error
    hda: dma timeout error: status=0x50 { DriveReady SeekComplete }
    ide: failed opcode was: unknown
    hdb: dma_timer_expiry: dma status == 0x41
    hdb: dma_timer_expiry: dma status == 0x41
    hdb: DMA timeout error
    hdb: dma timeout error: status=0x50 { DriveReady SeekComplete }
    ide: failed opcode was: unknown
    hdb: dma_timer_expiry: dma status == 0x41
    hdb: dma_timer_expiry: dma status == 0x41
    hdb: DMA timeout error
    hdb: dma timeout error: status=0x50 { DriveReady SeekComplete }
    ide: failed opcode was: unknown
    process `sysctl' is using deprecated sysctl (syscall) net.ipv6.neigh.eth0.base_reachable_time; Use net.ipv6.neigh.eth0.base_reachable_time_ms instead.
    init invoked oom-killer: gfp_mask=0x201d2, rder=0, omkilladj=0
     [<c04582d1>] out_of_memory+0x72/0x1a5
     [<c0459802>] __alloc_pages+0x216/0x297
     [<c045aafb>] __do_page_cache_readahead+0xc4/0x183
     [<c0457852>] filemap_nopage+0x157/0x349
     [<c046152d>] __handle_mm_fault+0x1d9/0xcfe
     [<c048119a>] link_path_walk+0x8d/0x95
     [<c047b1b0>] cp_new_stat64+0xfc/0x10e
     [<c06184c5>] do_page_fault+0x2d9/0x607
     [<c04ecdd1>] copy_to_user+0x31/0x48
     [<c06181ec>] do_page_fault+0x0/0x607
     [<c0405a89>] error_code+0x39/0x40
     =======================
    Mem-info:
    DMA per-cpu:
    cpu 0 hot: high 0, batch 1 used:0
    cpu 0 cold: high 0, batch 1 used:0
    DMA32 per-cpu: empty
    Normal per-cpu:
    cpu 0 hot: high 186, batch 31 used:168
    cpu 0 cold: high 62, batch 15 used:46
    HighMem per-cpu:
    cpu 0 hot: high 42, batch 7 used:5
    cpu 0 cold: high 14, batch 3 used:13
    Free pages:       12040kB (120kB HighMem)
    Active:124860 inactive:124873 dirty:0 writeback:0 unstable:0 free:3010 slab:2084 mapped-file:19 mapped-anon:249663 pagetables:2097
    DMA free:4096kB min:68kB low:84kB high:100kB active:3964kB inactive:3984kB present:16384kB pages_scanned:18840 all_unreclaimable? yes
    lowmem_reserve[]: 0 0 880 1007
    DMA32 free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
    lowmem_reserve[]: 0 0 880 1007
    Normal free:7824kB min:3756kB low:4692kB high:5632kB active:432504kB inactive:432312kB present:901120kB pages_scanned:3239482 all_unreclaimable? yes
    lowmem_reserve[]: 0 0 0 1023
    HighMem free:120kB min:128kB low:264kB high:400kB active:62972kB inactive:63196kB present:131008kB pages_scanned:219142 all_unreclaimable? yes
    lowmem_reserve[]: 0 0 0 0
    DMA: 0*4kB 0*8kB 0*16kB 0*32kB 0*64kB 4*128kB 0*256kB 1*512kB 1*1024kB 1*2048kB 0*4096kB = 4096kB
    DMA32: empty
    Normal: 16*4kB 0*8kB 3*16kB 3*32kB 1*64kB 1*128kB 1*256kB 0*512kB 1*1024kB 3*2048kB 0*4096kB = 7824kB
    HighMem: 0*4kB 1*8kB 1*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 120kB
    70 pagecache pages
    Swap cache: add 743789, delete 743789, find 155598/175549, race 0+0
    Free swap  = 0kB
    Total swap = 2097144kB
    Free swap:            0kB
    262128 pages of RAM
    32752 pages of HIGHMEM
    3337 reserved pages
    133 pages shared
    0 pages swap cached
    0 pages dirty
    0 pages writeback
    19 pages mapped
    2084 pages slab
    2097 pages pagetables
    Out of memory: Killed process 17391 (bash).
    automount invoked oom-killer: gfp_mask=0x201d2, rder=0, omkilladj=0
     [<c04582d1>] out_of_memory+0x72/0x1a5
     [<c0459802>] __alloc_pages+0x216/0x297
     [<c045aafb>] __do_page_cache_readahead+0xc4/0x183
     [<c0457852>] filemap_nopage+0x157/0x349
     [<c046152d>] __handle_mm_fault+0x1d9/0xcfe
     [<c0437c2c>] unqueue_me+0x6e/0x73
     [<c041e847>] default_wake_function+0x0/0xc
     [<c06184c5>] do_page_fault+0x2d9/0x607
     [<c044840a>] audit_syscall_entry+0x15a/0x18c
     [<c06181ec>] do_page_fault+0x0/0x607
     [<c0405a89>] error_code+0x39/0x40
     =======================
    Mem-info:
    DMA per-cpu:
    cpu 0 hot: high 0, batch 1 used:0
    cpu 0 cold: high 0, batch 1 used:0
    DMA32 per-cpu: empty
    Normal per-cpu:
    cpu 0 hot: high 186, batch 31 used:65
    cpu 0 cold: high 62, batch 15 used:61
    HighMem per-cpu:
    cpu 0 hot: high 42, batch 7 used:5
    cpu 0 cold: high 14, batch 3 used:2
    Free pages:       12060kB (120kB HighMem)
    Active:125247 inactive:124788 dirty:0 writeback:0 unstable:0 free:3015 slab:1880 mapped-file:26 mapped-anon:249964 pagetables:2086
    DMA free:4096kB min:68kB low:84kB high:100kB active:3944kB inactive:3964kB present:16384kB pages_scanned:12678 all_unreclaimable? yes
    lowmem_reserve[]: 0 0 880 1007
    DMA32 free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
    lowmem_reserve[]: 0 0 880 1007
    Normal free:7844kB min:3756kB low:4692kB high:5632kB active:434024kB inactive:432264kB present:901120kB pages_scanned:1371262 all_unreclaimable? yes
    lowmem_reserve[]: 0 0 0 1023
    HighMem free:120kB min:128kB low:264kB high:400kB active:63020kB inactive:62924kB present:131008kB pages_scanned:220754 all_unreclaimable? yes
    lowmem_reserve[]: 0 0 0 0
    DMA: 0*4kB 0*8kB 0*16kB 0*32kB 0*64kB 4*128kB 0*256kB 1*512kB 1*1024kB 1*2048kB 0*4096kB = 4096kB
    DMA32: empty
    Normal: 19*4kB 3*8kB 2*16kB 3*32kB 3*64kB 2*128kB 0*256kB 0*512kB 1*1024kB 3*2048kB 0*4096kB = 7844kB
    HighMem: 4*4kB 1*8kB 0*16kB 1*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 120kB
    71 pagecache pages
    Swap cache: add 1211048, delete 1211048, find 165346/186163, race 0+0
    Free swap  = 0kB
    Total swap = 2097144kB
    Free swap:            0kB
    262128 pages of RAM
    32752 pages of HIGHMEM
    3337 reserved pages
    252 pages shared
    0 pages swap cached
    0 pages dirty
    0 pages writeback
    26 pages mapped
    1880 pages slab
    2086 pages pagetables
    Out of memory: Killed process 17451 (bash).

  • iostat 命令说明_man文档

    2011-11-10 18:50:41


    XXX
    XXX WARNING: old character encoding and/or character set
    XXX
    IOSTAT(1)                     Linux User’s Manual                    IOSTAT(1)

    NAME
           iostat - Report Central Processing Unit (CPU) statistics and input/output statistics for devices and partitions.

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

    DESCRIPTION
           The  iostat  command  is  used for monitoring system input/output device loading by observing the time the devices are active in relation to their average
           transfer rates. The iostat command generates reports that can be used to change system configuration to better balance the input/output load between phys-
           ical disks.

           The  first  report  generated by the iostat command provides statistics concerning the time since the system was booted. Each subsequent report covers the
           time since the previous report. All statistics are reported each time the iostat command is run. The report consists of a CPU header row followed by a row
           of CPU statistics. On multiprocessor systems, CPU statistics are calculated system-wide as averages among all processors. A device header row is displayed
           followed by a line of statistics for each device that is configured.

           The interval parameter specifies the amount of time in seconds between each report. The first report contains statistics for the time since system startup
           (boot).  Each  subsequent report contains statistics collected during the interval since the previous report. The count parameter can be specified in con-
           junction with the interval parameter. If the count parameter is specified, the value of count determines the number of reports generated at interval  sec-
           onds apart. If the interval parameter is specified without the count parameter, the iostat command generates reports continuously.

    REPORTS
           The iostat command generates two types of reports, the CPU Utilization report and the Device Utilization report.

           CPU Utilization Report
                  The  first  report  generated  by  the iostat command is the CPU Utilization Report. For multiprocessor systems, the CPU values are global averages
                  among all processors.  The report has the following format:

                  %user
                         Show the percentage of CPU utilization that occurred while executing at the user level (application).
                  %nice
                         Show the percentage of CPU utilization that occurred while executing at the user level with nice priority.
                  %system
                         Show the percentage of CPU utilization that occurred while executing at the system level (kernel).
                  %iowait
                         Show the percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.
                  %steal
                         Show the percentage of time spent in involuntary wait by the virtual CPU or CPUs while the hypervisor was servicing another virtual  proces-
                         sor.
                  %idle
                         Show the percentage of time that the CPU or CPUs were idle and the system did not have an outstanding disk I/O request.

           Device Utilization Report
                  The  second report generated by the iostat command is the Device Utilization Report. The device report provides statistics on a per physical device
                  or partition basis. Block devices for which statistics are to be displayed may be entered on the command line. Partitions may also  be  entered  on
                  the  command line providing that option -x is not used.  If no device nor partition is entered, then statistics are displayed for every device used
                  by the system, and providing that the kernel maintains statistics for it.  If the ALL keyword is given on the command  line,  then  statistics  are
                  displayed  for  every device defined by the system, including those that have never been used.  The report may show the following fields, depending
                  on the flags used:

                  Device:
                         This column gives the device (or partition) name, which is displayed as hdiskn with 2.2 kernels, for the nth  device.  It  is  displayed  as
                         devm-n  with  2.4  kernels,  where  m is the major number of the device, and n a distinctive number.  With newer kernels, the device name as
                         listed in the /dev directory is displayed.

                  tps
                         Indicate the number of transfers per second that were issued to the device. A transfer is an I/O request to  the  device.  Multiple  logical
                         requests can be combined into a single I/O request to the device. A transfer is of indeterminate size.

                  Blk_read/s
                         Indicate  the amount of data read from the device expressed in a number of blocks per second. Blocks are equivalent to sectors with 2.4 ker-
                         nels and newer and therefore have a size of 512 bytes. With older kernels, a block is of indeterminate size.

                  Blk_wrtn/s
                         Indicate the amount of data written to the device expressed in a number of blocks per second.

                  Blk_read
                         The total number of blocks read.

                  Blk_wrtn
                         The total number of blocks written.

                  kB_read/s
                         Indicate the amount of data read from the device expressed in kilobytes per second.

                  kB_wrtn/s
                         Indicate the amount of data written to the device expressed in kilobytes per second.

                  kB_read
                         The total number of kilobytes read.

                  kB_wrtn
                         The total number of kilobytes written.

                  MB_read/s
                         Indicate the amount of data read from the device expressed in megabytes per second.

                  MB_wrtn/s
                         Indicate the amount of data written to the device expressed in megabytes per second.

                  MB_read
                         The total number of megabytes read.

                  MB_wrtn
                         The total number of megabytes written.

                  rrqm/s
                         The number of read requests merged per second that were queued to the device.

                  wrqm/s
                         The number of write requests merged per second that were queued to the device.

                  r/s
                         The number of read requests that were issued to the device per second.

                  w/s
                         The number of write requests that were issued to the device per second.

                  rsec/s
                         The number of sectors read from the device per second.

                  wsec/s
                         The number of sectors written to the device per second.

                  rkB/s
                         The number of kilobytes read from the device per second.

                  wkB/s
                         The number of kilobytes written to the device per second.

                  rMB/s
                         The number of megabytes read from the device per second.

                  wMB/s
                         The number of megabytes written to the device per second.

                  avgrq-sz
                         The average size (in sectors) of the requests that were issued to the device.

                  avgqu-sz
                         The average queue length of the requests that were issued to the device.

                  await
                         The average time (in milliseconds) for I/O requests issued to the device to be served.
                         This includes the time spent by the requests in queue
                         and the time spent servicing them.

                  svctm
                         The average service time (in milliseconds) for I/O requests that were issued to the device.

                  %util
                         Percentage  of CPU time during which I/O requests were issued
                         to the device (bandwidth utilization for the device).
                         Device saturation occurs when this value is close to 100%.

                  rops/s
                         Indicate the number of read operations that were issued to the mount point per second

                  wops/s
                         Indicate the number of write operations that were issued to the mount point per second

    OPTIONS
           -c     The -c option is exclusive of the -d option and displays only the CPU usage report.

           -d     The -d option is exclusive of the -c option and displays only the device utilization report.

           -k     Display statistics in kilobytes per second instead of blocks per second.  Data displayed are valid only with kernels 2.4 and newer.

           -m     Display statistics in megabytes per second instead of blocks or kilobytes per second.  Data displayed are valid only with kernels 2.4 and newer.

           -n     Displays the NFS-directory statistic.  Data displayed are valid only with kernels 2.6.17 and newer.  This option is exclusive ot the -x option.

           -h     Display the NFS report more human readable.

           -p [ { device | ALL } ]
                  The -p option is exclusive of the -x option and displays statistics for block devices and all their partitions that are used by the system.   If  a
                  device  name  is  entered  on  the  command line, then statistics for it and all its partitions are displayed. Last, the ALL keyword indicates that
                  statistics have to be displayed for all the block devices and partitions defined by the system, including those that have never  been  used.   Note
                  that this option works only with post 2.5 kernels.

           -t     Print the time for each report displayed.

           -V     Print version number then exit.

           -x     Display  extended  statistics.  This option is exclusive of the -p and -n, and works with post 2.5 kernels since it needs /proc/diskstats file or a
                  mounted sysfs to get the statistics. This option may also work with older  kernels  (e.g.  2.4)  only  if  extended  statistics  are  available  in
                  /proc/partitions (the kernel needs to be patched for that).

    ENVIRONMENT
           The iostat command takes into account the following environment variable:

           S_TIME_FORMAT
                  If  this  variable exists and its value is ISO then the current locale will be ignored when printing the date in the report header. The iostat com-
                  mand will use the ISO 8601 format (YYYY-MM-DD) instead.

    EXAMPLES
           iostat
                  Display a single history since boot report for all CPU and Devices.

           iostat -d 2
                  Display a continuous device report at two second intervals.

           iostat -d 2 6
                  Display six reports at two second intervals for all devices.

           iostat -x hda hdb 2 6
                  Display six reports of extended statistics at two second intervals for devices hda and hdb.

           iostat -p sda 2 6
                  Display six reports at two second intervals for device sda and all its partitions (sda1, etc.)

    BUGS
           /proc filesystem must be mounted for iostat to work.

           On SMP machines iostat assumes that CPU #0 is never disabled. Indeed iostat uses it to calculate the time interval.

           Extended statistics are available only with post 2.5 kernels.

    FILES
           /proc/stat contains system statistics.

           /proc/partitions contains disk statistics (for pre 2.5 kernels that have been patched).

           /proc/diskstats contains disks statistics (for post 2.5 kernels).

           /proc/uptime contains system uptime in seconds and centiseconds (for post 2.5 kernels).

           /sys contains statistics for block devices (post 2.5 kernels).

    AUTHOR
           Sebastien Godard (sysstat <at> wanadoo.fr)

    SEE ALSO
           sar(1), mpstat(1), vmstat(8)

           http://perso.orange.fr/sebastien.godard/

    Linux                            OCTOBER 2006                        IOSTAT(1)
  • PHP性能监测的工具介绍 - XHProf (转载)

    2011-11-10 18:42:10

    PHP性能监测的工具介绍 - XHProf

    http://www.cnblogs.com/cocowool/archive/2010/06/02/1750198.html



    PHP性能监测的工具介绍 - XHProf
    XHProf

    这个软件本是Facebook内部的一个应用工具,2009年3月份开源,为PHP的性能监测提供了很好的工具。官方的介绍中提到:

    XHProf is a hierarchical profiler for PHP. It reports function-level call counts and inclusive and exclusive metrics such as wall (elapsed) time, CPU time and memory usage.

    XHProf's light-weight nature and aggregation capabilities make it well suited for collecting "function-level" performance statistics from production environments.

     

    可以先来看看 XHProf 提供的图形界面的截图

     

    XHProf的一些特性:

    1、Flat Profile. 提供函数级的汇总信息,比如调用次数、执行时间、内存使用、CPU占用等。




    2、Hierarchical Profile。 对每个程序,进行了父级调用和子级调用的分解。




    3、Diff Reports(差异报告)。有很多种情况,我们希望能够对比,比如新版本比旧版本提升了多少速度,两个版本的差距究竟在哪里。Diff Report 就是这样的工具,接收两个输入,并且分别给出各自的 Flat Profile 和 Hierarchical Profile 报告。

    4、Callgraph View(调用视图)。性能监测的数据可以绘制成调用视图,方便我们查看。




    5、Memory Profile(内存监控)。这个特性帮助我们了解PHP如何分配和释放内存。值得注意的是,XHProf并不是严格的监测内存的分配和释放动作,而是计算每个函数进入和退出时的内存状况,这是一个相对简单的实现方式,但是基本上也能够满足我们日常的监控需求。

    6、如何处理外部文件。XHProf将 include,require,include_once,require_once进来的文件视作是一个 function。

    XHProf目前只支持一个级别的函数追踪,但是貌似也没有特别大的影响。

    XHProf的安装配置

    xhprof的安装配置很简单,我们首先在 PECL 的网站上下载 源码包 然后执行安装过程

    % cd <xhprof_source_directory>/extension/
    % phpize
    % ./configure --with-php-config=<path to php-config>
    % make
    % make install
    % make testphp.ini file: You can update your php.ini file to automatically load your extension. Add the following to your php.ini file.

    [xhprof]
    extension=xhprof.so
    ;
    ; directory used by default implementation of the iXHProfRuns
    ; interface (namely, the XHProfRuns_Default class) for storing
    ; XHProf runs.
    ;
    xhprof.output_dir=<directory_for_storing_xhprof_runs>

    xhprof的使用也很简单,只要将需要监控的脚本放在 xhprof_enable() 和 xhprof_disable() 中间,就可以得到相应的结果,同时也提供了一些参数可以让我们设置是否监控 Memory, CPU 的使用,是否监控PHP内置的函数,从 0.9.2 之后,还可以设置跳过一些特定的函数。

    XHProf 生成的数据,可以用 XHProf UI 来进行简单的显示。

    XHProf使用也很简单,下面是一个官方的例子:

    <?php

    function bar($x) {
      if ($x > 0) {
        bar($x - 1);
      }
    }

    function foo() {
      for ($idx = 0; $idx < 2; $idx++) {
        bar($idx);
        $x = strlen("abc");
      }
    }

    xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

    foo();

    $xhprof_data = xhprof_disable();

    //
    // Saving the XHProf run
    // using the default implementation of iXHProfRuns.
    //
    include_once "xhprof_lib/utils/xhprof_lib.php";
    include_once "xhprof_lib/utils/xhprof_runs.php";

    $xhprof_runs = new XHProfRuns_Default();

    // Save the run under a namespace "xhprof_foo".
    //
    // **NOTE**:
    // By default save_run() will automatically generate a unique
    // run id for you. [You can override that behavior. by passing
    // a run id (optional arg) to the save_run() method instead.]
    //
    $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

    echo "---------------\n".
         "Assuming you have set up the http based UI for \n".
         "XHProf at some address, you can view run at \n".
         "http://<xhprof-ui-address>/index.php?run=$run_id&source=xhprof_foo\n".
         "---------------\n";

    ?>

     

    我们可以持久化记录的数据,数据以文件的形式保存在指定的目录,如下图:

     有了这个工具,我们可以根据其提供的数据,与相应的通知接口整合,在程序运行出现问题时,及时的发送通知信息。

    xhprof画图使用的dot程序需要服务器上有libpng的环境支持,要想这部分能够正常绘图,需要安装 graphviz-2.24.0、libpng才行,具体的在参考资料4中有说。

     

    PHP性能监控,还有两个可用的工具,一个是 XDebug,另外一个是 ZendServer。


    参考文档:
    1、Speed UP your php with xhprof
    2、xhprof document
    3、xhprof 中文文档
    4、 编译xhprof的一个小意外

     
  • web_url/ web_submit_data / web_submit_form / web_custom_request 几个函数区别

    2011-11-10 15:10:21

     web_submit_data
    /
    web_submit_form
    /
    web_custom_request





    三个函数的差别;
    web_url

    The web_url function is an action function that loads the Web page (GET request) specified by the URL argument. The web_url function does not require a context.

    web_url is recorded only when VuGen is in either URL–based recording mode, or in HTML–based recording mode with the A script. containing explicit URLs only option checked (see VuGen's Recording Options).

    You can use web_url to simulate the download of a file from an FTP server. The web_url function causes the server to perform. the same tasks as if a file were actually being downloaded. The download is done in binary mode, unless "FtpAscii=1" is specified.

    Examples of non–HTML–generated resources are .gif and .jpg images. The List of Resource Attributes is only inserted when the recording option for these resources is set at Record within the current script. step. This is the default setting. Refer to the Creating Vuser Scripts guide.

    The HTTP header can be modified to pass additional information about the request to the server. Using HTTP headers you can, for example, allow other content types in the response such as compressed files, or you can request a Web page only on certain conditions. To modify the HTTP header in the request, see web_add_header. To modify all subsequent requests, see web_add_auto_header.

    This function is supported for all Web scripts, and for WAP scripts running in HTTP mode or Wireless Session Protocol (WSP) replay mode.



    Example: web_url
    Example 1 – Send an HTTP GET request to ABC's home page
    web_url("www.abc.com",

           "URL=http://www.abc.com/",

           "TargetFrame=",

           "TargetBrowser=Mercury Technologies",

           "Resource=0",

           "RecContentType=text/html",

           "Snapshot=t1.inf",

           "Mode=HTML",

           LAST);

    Example 2 – Send a HTTP request with a referrer page
    web_url("Hit the Slopes and Save",

           "URL=http://www.saleserver.com/American?BV_EngineID=

           ..fm_ski_sale_fall00guest.html",

           "TargetFrame=Main",

           "Resource=0",

           "RecContentType=text/html",

           "Referer=http://www.saleserver.com/American?BV_Operation=
           Dyn_Frame&..main–guest.tmpl",

           "Snapshot=t3.inf",

           "Mode=HTML",

           LAST);

    Example 3– Download a game
    web_url("Games",

           "URL=ftp://joe:secret@mygames.com/games/archive/loderunner.exe",

           "FtpAscii=1",

           LAST);

    Example 4– Login to Secure Site
    web_url("Login",

           "URL=https://secure.computing.com/scripts/login.asp?
           user=(username)&session={ssid}",

           "RecContentType=text/html", //Expected content–type



    ========================================================================================================================================================================================
     web_submit_data


    Performs an "unconditional" or "contextless" form. submission.



    The web_submit_data function is an action function that performs an "unconditional" or "contextless" form. submission. It allows you to generate GET and POST requests as made by the HTML forms. You don't need to have a form. context to execute this request.

    web_submit_data is recorded only when VuGen is in either the URL–based recording mode, or in the HTML–based recording mode with the A script. containing explicit URLs only option checked (see VuGen's Recording Options).

    The method indicates how the data of the form. is sent to the server, whether as a query within the URL (GET), or as a request body (POST).

    This function is generated when VuGen is set to record a Web session in HTTP (all requests from the server) recording mode. VuGen also records a web_submit_data statement whenever a form. is submitted and it is unable to generate a web_submit_form. statement.

    Examples of non–HTML–generated resources are .gif and .jpg images. The List of Resource Attributes is only inserted when the recording option for these resources is set at Record within the current script. step. This is the default setting. Refer to the Creating Vuser Scripts guide.

    In Java calls to lrapi.web.submit_data the list of attributes, including hidden fields, is part of the options array. The list of data and the list of resources are part of the data array.

    The HTTP header can be modified to pass additional information about the request to the server. Using HTTP headers you can, for example, allow other content types in the response such as compressed files, or you can request a Web page only on certain conditions. To modify the HTTP header in the request see web_add_header, or to modify all subsequent requests see web_add_auto_header.



    Example: web_submit_data
    In the following example, the web_submit_data function submits a form. using the POST method:

    web_submit_data("default.aspx",

           "Action=http://lazarus/flightnet/default.aspx",

           "Method=POST",

           "TargetFrame=",

           "RecContentType=text/html",

           "Referer=http://lazarus/flightnet/",

           "Snapshot=t7.inf",

           "Mode=HTML",

           ITEMDATA,

           "Name=grpType", "Value=radRoundtrip", ENDITEM,

           "Name=lstDepartingCity", "Value=DEN", ENDITEM,

           "Name=lstDestinationCity", "Value=LAX", ENDITEM,

           "Name=txtDepartureDate", "Value=8/19/2003", ENDITEM,

           "Name=txtReturnDate", "Value=8/19/2003", ENDITEM,

           "Name=txtQuantity", "Value=1", ENDITEM,

           "Name=radClass", "Value=1", ENDITEM,

           "Name=radSeat", "Value=1", ENDITEM,

           "Name=btnAvailableFlights", "Value=Next >", ENDITEM,

           LAST);

    In the following example, the web_submit_data function submits two files using the POST method:

    web_submit_data("Attachments",

           "Action=http://barton.cottage@.Devonshire.uk/Attachments?YY=45434",

           "Method=POST",

           "EncType=multipart/form–data",

           "TargetFrame=",

           "RecContentType=text/html",

           "Referer=http:///barton.cottage@.Devonshire.uk/Compose?YY=20435",

           "Snapshot=t5.inf",

           "Mode=HTML",

           ITEMDATA,

                  "Name=userFile0",

                  "Value=E:\\sense_sensibility\\Elinor.txt",

                  "File=yes",

                  "ContentType=text/html", // Override default "text/plain" for .txt files

           ENDITEM,

                  "Name=userFile1",

                  "Value=E:\\sense_sensibility\\Marianne.jpg",

                  "File=yes",

           ENDITEM,

           LAST);






    ========================================================================================================================================================================================
    web_submit_form

    Submits a form.



    The web_submit_form. function is an action function that submits a form. The web_submit_form. function may be executed only in the context of a previous operation.

    web_submit_form. is recorded only when VuGen is in HTML–based recording mode (see VuGen's Recording Options).

    Examples of non–HTML–generated resources are .gif and .jpg images. The List of Resource Attributes is only inserted when the recording option for these resources is set at "Record within the current script. step". This is the default setting. Refer to the Creating Vuser Scripts guide.

    When web_submit_form. is recorded, "name" and "value" are generally recorded for items in the ITEMDATA section. If you do not wish the recorded value to appear in the script, you can encrypt it. Change the word "Value" to "EncryptedValue", and substitute the encrypted value for the recorded value. For example:





    Example 1
    In the following example, the name of the web_submit_form. function is "employee.exe". The function submits a request for information about the employee John Green. The function has no attributes because the form. is uniquely identified by the item data.

    web_submit_form("employee.exe",

           ITEMDATA,

           "name=persons", "value=John Green – John", ENDITEM,

           "name=go_page", "value=Go to Page", ENDITEM,

           LAST);

    Example 2
    In the following example, a user submitted a search in a company's library, for the book "Practical UNIX Security" by Garfinkel.

    web_url("dogbert", "URL=http://dogbert/", LAST);

    web_link("Departments:", "Text=Departments:", LAST);

    web_url("index.html", "URL=http://dogbert/groups/library/index.html", LAST);

    web_link("Book Search:", "Text= Book Search:", LAST);

    web_submit_form("db2net.exe",

           ITEMDATA,

           "name=library.TITLE", "value=Practical UNIX Security", ENDITEM,

           "name=library.AUTHOR_S_", "value=Garfinkel", ENDITEM,

           "name=library.SUBJECTS", "value=", ENDITEM,

           LAST);




    ========================================================================================================================================================================================


    web_custom_request


    Allows you to create a custom HTTP request with any method supported by HTTP.

    The web_custom_request function is an action function that allows you to create a custom HTTP request using any method or body. By default, VuGen generates this function only for requests that could not be interpreted with other web functions.

    To insert this function manually, use the Add Step dialog box. To specify an HTTP header to be sent before the custom request, add a web_add_header or web_add_auto_header function.


    Attributes
    URL – the URL (Uniform. Resource Locator) of the Web page to load.

    Method – the form. submission method: POST or GET.

    Body – the body of the request. See the Body Attribute section for a complete list of available options.

    Raw Body – the body of the request is passed as a pointer to the data. See the Raw Body Attribute section.

    BodyFilePath – The path to a file to be passed as the body of the request. BodyFilePath can not be used together with Body, or any Body Attribute or Raw Body Attribute: BodyBinary, BodyUnicode, RAW_BODY_START , or Binary=1.

    Mode – the Recording Level: HTML or HTTP. Click here for more information.




    Example: web_custom_request
    In the following recorded script, the user began recording from http://lazarus/html/forms/file.html.
    When the user submitted his request, VuGen inserted a web_add_header function, followed by a web_custom_request function.
    web_url("file.html", "URL=http://lazarus/html/forms/file.html",

           "TargetFrame=_TOP", LAST);

    web_add_header("Content–Type",

    "multipart/form–data; boundary=–––––––––––––––––––––––––––292742461228954");

    web_custom_request("post_query.exe", "Method=POST",

           "URL=http://lazarus/cgi–bin/post_query.exe",

           "Body=–––––––––––––––––––––––––––––292742461228954\r\nContent–Disp"

           "osition: form–data; name=\"entry\"\r\n\r\nText\r\n––––––––––"

           "–––––––––––––––––––292742461228954\r\nContent–Disposition: f"

           "–––––––––––292742461228954––\r\n",

           "TargetFrame=",

           LAST);





    web_submit_data

    Performs an "unconditional" or "contextless" form. submission.


    The web_submit_data function is an action function that performs an "unconditional" or "contextless" form. submission.
    It allows you to generate GET and POST requests as made by the HTML forms. You don't need to have a form. context to execute this request.

    web_submit_data is recorded only when VuGen is in either the URL–based recording mode, or in the HTML–based recording mode with the A script. containing explicit URLs only option checked (see VuGen's Recording Options).

    The method indicates how the data of the form. is sent to the server, whether as a query within the URL (GET), or as a request body (POST).

    This function is generated when VuGen is set to record a Web session in HTTP (all requests from the server) recording mode. VuGen also records a web_submit_data statement whenever a form. is submitted and it is unable to generate a web_submit_form. statement.

    Examples of non–HTML–generated resources are .gif and .jpg images. The List of Resource Attributes is only inserted when the recording option for these resources is set at Record within the current script. step. This is the default setting. Refer to the Creating Vuser Scripts guide.

    In Java calls to lrapi.web.submit_data the list of attributes, including hidden fields, is part of the options array. The list of data and the list of resources are part of the data array.

    The HTTP header can be modified to pass additional information about the request to the server. Using HTTP headers you can, for example, allow other content types in the response such as compressed files, or you can request a Web page only on certain conditions. To modify the HTTP header in the request see web_add_header, or to modify all subsequent requests see web_add_auto_header.


    web_submit_form
    Submits a form.
    The web_submit_form. function is an action function that submits a form. The web_submit_form. function may be executed only in the context of a previous operation.
    web_submit_form. is recorded only when VuGen is in HTML–based recording mode (see VuGen's Recording Options).


    web_custom_request
    Allows you to create a custom HTTP request with any method supported by HTTP.









    ============================================================================


    web_get_int_property
    Returns specific information about the previous HTTP request.

    The web_get_int_property function returns specific information about the previous HTTP request.

    The meaning of the return value depends on the HttpInfoType argument. HttpInfoType can be any of the following options. The first constant in each pair (HTTP_*) is for C, the second (object.HTTP_*) is for object oriented languages.

    HTTP_INFO_RETURN_CODE or object.HTTP_INFO_RETURN_CODE

    The return code in HTTP response header.

    HTTP_INFO_DOWNLOAD_SIZE or object.HTTP_INFO_DOWNLOAD_SIZE

    The size (in bytes) of the last download, including the header, body, and communications overhead (for example, NTLM negotiation).

    HTTP_INFO_DOWNLOAD_TIME or object.HTTP_INFO_DOWNLOAD_TIME

    The time in (milliseconds) of the last download.

    HTTP_INFO_TOTAL_REQUEST_STAT or object.HTTP_INFO_TOTAL_REQUEST_STAT

    Returns the accumulated size of all headers and bodies since the first time web_get_int_property was issued with HTTP_INFO_TOTAL_REQUEST_STAT.

    HTTP_INFO_TOTAL_RESPONSE_STAT or object.HTTP_INFO_TOTAL_RESPONSE_STAT

    Returns the accumulated size, including header and body, of all responses since the first time web_get_int_property was issued with HTTP_INFO_TOTAL_RESPONSE_STAT

    This function is supported for all Web scripts, and for WAP scripts running in HTTP mode only. It is not supported for WAP scripts running in Wireless Session Protocol (WSP) replay mode.

    Example: web_get_int_property
    The following example uses the web_get_int_property function to check if the script. successfully accessed the my_home home page.

    {

    int HttpRetCode;

    web_url("my_home",

           "URL=http://my_home",

           "TargetFrame=_TOP",

           LAST);

    HttpRetCode = web_get_int_property(HTTP_INFO_RETURN_CODE);

    if (HttpRetCode == 200)

           lr_log_message("The script. successfully accessed the My_home home page");

           else

           lr_log_message("The script. failed to access the My_home home page ");

    }

    Output:

    HTTP_INFO_RETURN_CODE = 200

    HTTP_INFO_DOWNLOAD_SIZE = 53685

    HTTP_INFO_DOWNLOAD_TIME = 2204

    The following example uses the web_get_int_property function to calculate the traffic in an action, and for a single step.

    Action()

    {

           int initial_byte_request_ct, before_submit_request_ct, after_submit_request_ct, submit_byte_request_ct, final_request_ct;

           int initial_byte_response_ct, before_submit_response_ct, after_submit_response_ct, submit_byte_response_ct, final_response_ct;

           initial_byte_request_ct = web_get_int_property(HTTP_INFO_TOTAL_REQUEST_STAT);

           initial_byte_response_ct = web_get_int_property(HTTP_INFO_TOTAL_RESPONSE_STAT);

           web_submit_data("com.mercurytours.servlet.ReservationServlet",

                  "Action=http://newtours.mercuryinteractive.com/servlets/com.mercurytours.servlet.ReservationServlet?procSub=1&pg=1",

                  "Method=POST",

                  "RecContentType=text/html",

                  "Referer=http://newtours.mercuryinteractive.com/servlets/com.mercurytours.servlet.ReservationServlet",

                  "Snapshot=t7.inf",

                  "Mode=HTML",

                  ITEMDATA,

                  "Name=tripType", "Value=roundtrip", ENDITEM,

                  "Name=passCount", "Value=2", ENDITEM,

                  "Name=fromPort", "Value=San Francisco", ENDITEM,

                  "Name=fromMonth", "Value=12", ENDITEM,

                  "Name=fromDay", "Value=10", ENDITEM,

                  "Name=toPort", "Value=Acapulco", ENDITEM,

                  "Name=toMonth", "Value=12", ENDITEM,

                  "Name=toDay", "Value=14", ENDITEM,

                  "Name=servClass", "Value=Business", ENDITEM,

                  "Name=airline", "Value=Pangea Airlines", ENDITEM,

                  "Name=findFlights.x", "Value=63", ENDITEM,

                  "Name=findFlights.y", "Value=10", ENDITEM,

                  LAST);

           before_submit_request_ct = web_get_int_property(HTTP_INFO_TOTAL_REQUEST_STAT);

           before_submit_response_ct = web_get_int_property(HTTP_INFO_TOTAL_RESPONSE_STAT);

           lr_message("Before Submit:Request = %d, Response = %d",

                                before_submit_request_ct,before_submit_response_ct);

           /* Before Submit:Request = 1182, Response = 14177 */

           web_submit_data("com.mercurytours.servlet.PurchaseServlet",

                  "Action=http://newtours.mercuryinteractive.com/servlets/com.mercurytours.servlet.PurchaseServlet",

                  "Method=POST",

                  "RecContentType=text/html",

                  "Referer=http://newtours.mercuryinteractive.com/servlets/com.mercurytours.servlet.ReservationServlet?procSub=1&pg=1",

                  "Snapshot=t9.inf",

                  "Mode=HTML",

                  ITEMDATA,

                  "Name=outFlight", "Value=Pangea Airlines$612$356$9:23$", ENDITEM,

                  "Name=inFlight", "Value=Pangea Airlines$162$364$16:43$", ENDITEM,

                  "Name=reserveFlights.x", "Value=61", ENDITEM,

                  "Name=reserveFlights.y", "Value=9", ENDITEM,

                  LAST);

           after_submit_request_ct = web_get_int_property(HTTP_INFO_TOTAL_REQUEST_STAT);

           submit_byte_request_ct = after_submit_request_ct - before_submit_request_ct ;

           after_submit_response_ct = web_get_int_property(HTTP_INFO_TOTAL_RESPONSE_STAT);

           submit_byte_response_ct = after_submit_response_ct - before_submit_response_ct ;

           lr_message("After Submit:Request = %d, Response = %d",

                                after_submit_request_ct,after_submit_response_ct);

           /* After Submit:Request = 2695, Response = 58681*/

           lr_message("Submit Net traffic:Request = %d, Response = %d",

                                submit_byte_request_ct,submit_byte_response_ct);

           /*Submit Net traffic:Request = 1513, Response = 44504 */

           web_url("search_5",

                  "URL=http://toolbarqueries.google.com/search?client=navclient-auto&googleip=O;66.102.11.99;240&ie=UTF-8&oe=UTF-8&features=Rank:&q=info:http%3A%2F%2Fnewtours%2Emercuryinteractive%2Ecom%2Fservlets%2Fcom%2Emercurytours%2Eservlet%2EPurchaseServlet&ch=762475275111",

                  "Resource=0",

                  "RecContentType=text/html",

                  "Referer=",

                  "Snapshot=t10.inf",

                  "Mode=HTML",

                  LAST);

           web_submit_data("com.mercurytours.servlet.PurchaseServlet_2",

                  "Action=http://newtours.mercuryinteractive.com/servlets/com.mercurytours.servlet.PurchaseServlet?procSub=1&pg=1",

                  "Method=POST",

                  "RecContentType=text/html",

                  "Referer=http://newtours.mercuryinteractive.com/servlets/com.mercurytours.servlet.PurchaseServlet",

                  "Snapshot=t22.inf",

                  "Mode=HTML",

                  ITEMDATA,

                  "Name=passFirst0", "Value=Fitzwilliam", ENDITEM,

                  "Name=passLast0", "Value=Darcy", ENDITEM,

                  "Name=pass.1.meal", "Value=VGML", ENDITEM,

                  "Name=passFirst1", "Value=Elizabeth", ENDITEM,

                  "Name=passLast1", "Value=Darcy", ENDITEM,

                  "Name=pass.1.meal", "Value=LCML", ENDITEM,

                  "Name=creditCard", "Value=CB", ENDITEM,

                  "Name=creditnumber", "Value=123456789", ENDITEM,

                  "Name=cc_exp_dt_mn", "Value=01", ENDITEM,

                  "Name=cc_exp_dt_yr", "Value=2008", ENDITEM,

                  "Name=cc_frst_name", "Value=Catherine", ENDITEM,

                  "Name=cc_mid_name", "Value=", ENDITEM,

                  "Name=cc_last_name", "Value=DeBourgh", ENDITEM,

                  "Name=ticketLess", "Value=checkbox", ENDITEM,

                  "Name=billAddress1", "Value=Rosings Park", ENDITEM,

                  "Name=billAddress2", "Value=", ENDITEM,

                  "Name=billCity", "Value=Lambton", ENDITEM,

                  "Name=billState", "Value=Derbyshire", ENDITEM,

                  "Name=billZip", "Value=94089", ENDITEM,

                  "Name=billCountry", "Value=214", ENDITEM,

                  "Name=ticketLess", "Value=checkbox", ENDITEM,

                  "Name=delAddress1", "Value=1325 Borregas Ave.", ENDITEM,

                  "Name=delAddress2", "Value=", ENDITEM,

                  "Name=delCity", "Value=Sunnyvale", ENDITEM,

                  "Name=delState", "Value=CA", ENDITEM,

                  "Name=delZip", "Value=94089", ENDITEM,

                  "Name=delCountry", "Value=215", ENDITEM,

                  "Name=buyFlights.x", "Value=51", ENDITEM,

                  "Name=buyFlights.y", "Value=15", ENDITEM,

                  LAST);

           web_url("com.mercurytours.servlet.SignonServlet_2",

                  "URL=http://newtours.mercuryinteractive.com/servlets/com.mercurytours.servlet.SignonServlet",

                  "Resource=0",

                  "RecContentType=text/html",

                  "Referer=http://newtours.mercuryinteractive.com/servlets/com.mercurytours.servlet.PurchaseServlet?procSub=1&pg=1",

                  "Snapshot=t24.inf",

                  "Mode=HTML",

                  LAST);

           web_url("search_6",

                  "URL=http://toolbarqueries.google.com/search?client=navclient-auto&googleip=O;216.239.59.99;701&ie=UTF-8&oe=UTF-8&features=Rank:&q=info:http%3A%2F%2Fnewtours%2Emercuryinteractive%2Ecom%2Fservlets%2Fcom%2Emercurytours%2Eservlet%2ESignonServlet&ch=722304523644",

                  "Resource=0",

                  "RecContentType=text/html",

                  "Referer=",

                  "Snapshot=t25.inf",

                  "Mode=HTML",

                  LAST);

           final_request_ct = web_get_int_property(HTTP_INFO_TOTAL_REQUEST_STAT);

           lr_message("REQUEST: Initial = %d, before submit = %d, after_submit = %d, submit size = %d, total = %d",

                                initial_byte_request_ct, before_submit_request_ct, after_submit_request_ct, submit_byte_request_ct, final_request_ct);

           /*REQUEST: Initial = 0, before submit = 1182, after_submit = 2695, submit size = 1513, total = 7911 */

           final_response_ct = web_get_int_property(HTTP_INFO_TOTAL_RESPONSE_STAT);

           lr_message("RESPONSE: Initial = %d, before submit = %d, after_submit = %d, submit size = %d, total = %d",

                                initial_byte_response_ct, before_submit_response_ct, after_submit_response_ct, submit_byte_response_ct, final_response_ct);

           /* RESPONSE: Initial = 0, before submit = 14177, after_submit = 58681, submit size = 44504, total = 86444 */

           return 0;

    }




  • 男人的责任是什么?

    2011-11-10 15:01:42


    男人的责任是什么?



    一、拥有自信和风度
         男人到了二十几岁后,就要开始学着用心去经营自己了,它体现在自己的思想与涵养上。自信是一个男人最重要的品质,自信的男人就你像一只在暴风雨中战斗的海鸥。海鸥所要说的只有一句话“让暴风雨来的再猛烈些吧”,只因为它无所畏惧。一个自信的男人,总是能够感染别人,无论这些人是朋友还是敌人。要使别人对你有信心,就必须要先对自己充满信心。自信的男人可以战胜一切困难。
         一个有风度的男人就像一片大海,不拒点滴,又包容江河。有风度使男人得到更多的青睐,不争眼前才能够放眼世界,给予别人才能够受益无穷。正所谓“宰相肚里能撑船”,一个心如大海的男人,肚中不知能撑多少船呀!风度偏偏让男人看上去潇洒万千。

    二、养成看书和写作的习惯
         男人到了二十几岁后,就开始要走入社会了,在与别人交往的过程中,谈吐与修养是最能征服别人的。一个有知识的男人一定是常看书的,一个有智慧的男人一定是常写作的。无论自己多忙,都要抽出时间来看看书,写写文章。因为这样做能够改变一个男人的思想与行为。一个男人要改变自己思想首先要做的就是读一本好书,读一本书就像交了一个好朋友,他能够帮助你走好自己的路。读书的生活是最丰富多彩的,写作的时光是最能启迪智慧的。
         喜欢看书和写作的男人,一定能够培养出一个好的心态。因为知识与智慧的海洋是无边无际的,但喜欢看书和写作的男人却能做到执著追求。追求是一个男人的思想,也是一个男人的行动,永不放弃地追求,无时不刻的在激励的男人去战斗。在这种战斗中,使一个男人能够经历风雨的洗礼,成长为一棵参天大树。读书使男人变得的冷静,写作使男人变得成熟。

    三、要试着发现生活里的真、善、美
         男人到了二十几岁后,就要学会如何去面对生活。什么是“真”,现在的男人越来越不懂,那是因为现在的男人都很浮躁,他们不懂什么才是“真心”地去生活。“真”,就是对自己实事求是,不要骗自己,也不要骗别人。“真”,就是诚实做人,诚实做事,诚实的男人最可爱。“善”,自然是善良的意思了。善待别人,就是在善待自己的生活。“善”其实就在我们每一个人的身边,不要为难别人,不要挖苦别人,不要侮辱别人,就是善良的行为。有时你的一点点善意就能结出一个善果,使你的生活因此而变得幸福。
         哲人说,“生活中本不缺少美,缺少的是发现美的眼睛”。是的,生活也的确是如此。不要总在惦记着自己的不幸,这样做只能使你生活的更加不幸。你觉得 “不幸”是因为你无法乐观的面对生活,生活总是充满着希望的。只要你常常抬抬头,看看阳光,你就能感受到温暖。在温暖中乐观地去追美好的人生,你自然能够发现美。

    四、与有思想的人交朋友
         男人到了二十几岁后,就要开始有目的性的去选择朋友了。社会中的人脉关系是非常重要的,你的朋友圈子将对你的人生起着很大的影响。男人要广交朋友,多交诤友,不交损友。所谓诤友就是那些对你有帮助的朋友,而这些人往往自身也很优秀。多交诤友对一个人的生活、工作都是非常有益的。但真正的诤友也不易结交,因为这种朋友需要你付出极大的真诚,发自内心的真诚。
         有思想的朋友,他很清楚你有没有把他当作朋友。如果你只是在利用他,他在心中是不会把你当作朋友来看待的。交朋友有时并没有什么目的性,你只是觉得这个人很有思想,值得你与之相交。但往往就是这些有思想的朋友,在你最困难的时候向你伸出他的手。朋友,是一个男人生命中最重要的元素的之一。一个男人要想使自己像一人真正的男人那样活着,就一定要广交朋友,多交诤友。



    五、必须改掉自身的不良习惯
         男人到了二十几岁后,就必须要改掉自身的不良习惯。不良的习惯是养成的,良好的习惯也是养成。培养自己拥有良好的习惯,就是在改掉自身的不良习惯。如果一个男人到了二十几岁后,身上还有这样那样的不良习惯,那就是一件非常糟糕的事情了。这些不良的习惯会阻碍你人生的发展,生活会因此而失去不少光彩,事业也会因此难以取得更大的成功。
         如果你到现在还爱睡懒觉,那么清晨的第一抹阳光永远也不会照到你的笑脸上。如果你到现在还总是拖拖拉拉的,那么你将永远也无法站在冠军的位置上。如果你到现在还不会主动的去学习和工作,那么你的前途只能是一片暗淡无光的灰色。我相信没有哪一个男人想要灰色的人生,所有的男人都期望自己能有一个绚丽多彩的人生。所以为了使自己的人生绚丽多彩,男人到了二十几岁后,就必须要改掉自身的不良习惯。

    六、学会忍耐与宽容
         男人到了二十几岁后,就要学会忍耐与宽容。在社会中常有许多你无法接受的事情,但这些事情你又不得不接受时,这就需要你的忍耐。忍耐别人其实也是在宽容别人,一个能够宽容别人的男人会显得很大度。成功的男人往往也是一个能够忍辱负重的男人。耐得住寂寞的男人从不甘***人的忍耐是为了更好的爆发。
         对那些说我们是傻瓜的人,说一句“我就是傻瓜”,使他们不知所措吧!对于那些无故指责我们的人,不要与他们争论,因为这样只会使自己变的愤怒。与其去伤害别人,不如去宽容别人,宽容是治疗他人伤口最好的灵丹圣药。

    七、保持良好的心态,重视自己的身体
         男人到了二十几岁后,就要学会调节自己的心态,重视自己的身体。身体是革命的本钱,心态是验钞机。男人要想获取更多的财富就要拥有一副强健的体魄,男人要想长久的做首富就要拥有一种积极乐观的心态。注意饮食,经常锻练,充足的睡眼,是健康身体的保证。不要患得患失,勤奋拼搏,让心态决定一切。
         你可以不用天天去晨跑,其实那也不会占用你多长的时间,需要的只是恒心和毅力。但你一定要时常去运动一下你的身体,散步是一种不错的选择,这样做会使你充满力量。你在冬天可以不用冷水洗澡,其实那也没有什么大不了的,因为我也曾坚持过一个冬天。但你在冬天一定要经常用冷水洗洗脸,这样做不仅可以防止感冒,还能保持一个清醒的头脑。你可以失败,但你永远要保持一种求胜的心态,战胜自己你就没有敌人。

    八、时刻保持你的微笑,让礼貌成为你的名片
         男人到了二十几岁后,要时刻保持你的微笑。笑脸迎人,说明你是一个善良的人,所有的人都愿意与善良的人打交道。不要把苦闷写在你的脸上,这样只会使别人远离你。你是什么样的人,别人通过你是否微笑着与他打招呼来判断。而这种判断对你在人家心中的印象起着很重要的作用。
         人们常说“细节决定成败”,而这细节往往就反应在你是不是一个有礼貌的人。有礼貌的人,知道关心别人。别人也会因为你的礼貌与关心,而给你走向成功的机会。男人的名片是微笑与礼貌,它是男人成就事业的通行证。

    九、追求一个自己真正爱的女人,你一辈子也不会后悔
         男人到了二十几岁后,慢慢地就会极渴望爱情。这是非常正常的事情,千万不压抑自己这种发自内心的情感。一个男人最傻最可爱的时候就是当他爱上了一个女人的时候。当你爱上一个女人却不知道她会不会爱上你的时候,你一定要选择一个恰当的时间向他表白。至于他是选择接受还选择拒绝那就要看你们之间的缘份和你的努力了。男人一定要明白,女人最渴望的一定是一个深爱着她的男人。

         爱情这种事不能强求,男人一定要明白。千万不要因为得不到你的爱情就让你的友情轻易的失去,能与一个自己曾经爱过的女人成为朋友是一件不可多得的好事。爱情之所以神圣不可侵犯,是因为它是人最心甘情愿的选择,它体现的人与人之间的尊重与信任。所以男人一定要尊重你爱着的那个女人的选择,相信她的选择是为了她自己的幸福而做出的决定。只要你曾经追求一个自己真正爱的女人,那么你一辈子也不会后悔。

    十、为了自己的事业付出一切
         男人到了二十几岁后,一定要为了自己的事业去努力拼搏。男人最重要的就是事业,没有事业的男人不能算作真正的男人。男人的事业不定要轰轰烈烈,但一定要有所成就,能使自己感到骄傲和自豪。一个事业心强的男人,也是一个求胜心与责任心同样强的男人。求胜心强的男人,从不甘平庸。责任心强的男人,从不惧困难。男人因自己成功的事业而变得高大,从而获得别人的尊重和信任。
         作为一个男人,就要为了自己的事业付出一切。要想成功你必须付出,而付出就意味你要失去一些东西。如果你不想为事业付出任何代价,那么你只能失去更多的东西,而且最后还一无所获。

    十一、爱情跟事业是可以共同拥有的
         男人到了二十几岁后,就应该努力做到爱情跟事业的双丰收。人们常说一个男人如果选择了爱情就会失去事业,如果选择了事业就得不到爱情。我却偏偏不这样认为,我反而觉得爱情越甜蜜的男人,事业越成功。其实爱情和事业本就是两回事,爱得轰轰烈烈的男人,一点也不会妨碍其获得成功的事业。一个有爱情滋润的男人一定比一个不知爱情是什么味道的男人更成熟,更有魅力,更有干一番事业的决心。
         二十几岁的男人们,千万不要相信那些偏激的人所说的话。就像人们常说的“婚姻是爱情的坟墓”,这种说法太偏激了。婚姻与爱情的区别只是多了一些“柴米油盐”,可以说婚姻才是一种完整的爱情,之前的爱情只是处在一种恋爱的阶段。也只有通过婚姻才能使男人和女人彻底的认识什么是爱情。爱情就是相互理解,相互鼓励,相互支持。在生活上彼此帮助,在事业上彼此帮助,让爱情跟事业可以双丰收。

    十二、一定要努力比女人做的更好
         男人到了二十几岁后,在任何事上一定要努力比女人做的更好。即使在一些不可能比女人做的更好的事情上,也要努力做的和女人一样好。在这里这不是想说男人天生就应该比女人强,而是要说男人天生就应该比女人做的更好。因为只要女人努力了,就很容易超越男人,所以男人应该知道努力比女人做的更好是天经地义的事情。在如今的社会,女人的地位越来越高了,女人第一次有了选择男人的权力。所以如果作为男人的你,不能比女人做的更好,那么女人凭什么选择你呢?
         女人们常说“女子能顶半边天”,而且现在的女人在本属于男人的某些领域里比男人做的更出色。所以男人不仅要在属于自己的领域里做的非常出色,而且也要能在本属于女人的领域里做得一样的出色。

    十三、努力帮自己的妻子实现她的梦想
         男人到了二十几岁后,如果你已经结婚了,那就请你一定要努力帮自己的妻子实现她的梦想。人们学说“男人靠征服世界来征服女人,女人靠征服男人来征服世界”,所以一个已经征服了你的女人,你一定要努力帮她征服世界。女人的梦想从不会因为和一个男人生活在一起了而消失掉,只会因此而变得更加强烈。女人这种强烈的愿望和梦想也许不会表现在你的面前,但你的心中一定要明白。
         妻子是一个男人生命的核心,妻子生活得是否幸福,男人一定要关心。不要以为妻子取回家,就是来为你服务的。每一个男人的妻子都会关心自己的丈夫,每一个男人也要学会关心自己的妻子。而最关心妻子的事,莫过于关心她的梦想是什么,怎么做才能帮妻子实现她的梦想。

    十四、学会勇敢一些,去承担起自己肩上的责任
         男人到了二十几岁后,要学会勇敢一些,挻起自己的肩膀去承担起属于自己的那份义不容辞的责任。孝顺父母是一个男人责任,疼爱妻儿是一个男人的责任,成就事业也是一个男人的责任。男人的责任不外乎家庭和事业。这些责任的确比较沉重,但作为一个男人你必须挻起自己的肩膀去承担。没有什么原因,只因为你是一个男人。
         男人一样有权力哭泣,但却没有权力哭出声音来。男人一样有权力流泪,但却没有权力在父母妻儿面前流泪。男人一样有权力放弃,但却没有权力放弃家庭与事业上的责任。作为一个男人,你别无选择,你只能选择承担,用你的肩膀去承担。

    十五、永远不要放弃自己,相信自己一定能行
         男人到了二十几岁后,就必须做到永远不要放弃自己。别人之所以放弃你,那就因为你已经先放弃了自己。相信只要你不放弃自己,没有哪个人会放弃你或者说没有哪个人能放弃你。相信自己是一个男人战胜一切的力量之源,不相信自己的男人没有成功的理由,因为他的一脚已经跨到了失败的坟墓中。
         有一句广告语,这样说“相信自己,力量在心中”。还有一句广告语,这样说“我能”。是的,我想,我也相信只要每一个男人能够做到相信自己,你就一定能行。



     
    http://tieba.baidu.com/f?kz=801810867









  • 高负载系统,网络参数调整(转载)

    2011-11-09 18:31:11

    参考:http://niyunjiu.iteye.com/blog/731404

    Linux内核 tcp/ip 调优:

    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.tcp_keepalive_time = 300
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.ip_local_port_range = 5000 65000
    net.ipv4.tcp_max_tw_buckets = 5000
    net.ipv4.tcp_max_syn_backlog = 2048
    net.ipv4.tcp_synack_retries = 2
    net.ipv4.tcp_syn_retries = 2

    参考:
    #kernel.shmmax=67108864
    #vm.min_free_kbytes = 65536
    #vm.swappiness = 0
    #net.core.rmem_max = 33554432
    #net.core.wmem_max = 33554432
    #net.core.netdev_max_backlog =  2500
    #net.core.somaxconn = 262144
    #net.ipv4.ip_local_port_range = 5000  65000
    net.ipv4.tcp_max_syn_backlog = 2048
    net.ipv4.tcp_synack_retries = 2
    net.ipv4.tcp_syn_retries = 2
    #net.ipv4.tcp_tw_recycle = 0
    #net.ipv4.tcp_tw_reuse = 1
    #net.ipv4.tcp_rmem = 4096 16384 33554432
    #net.ipv4.tcp_wmem = 4096 16384 33554432
    #net.ipv4.tcp_mem = 786432 1048576 26777216
    #net.ipv4.tcp_keepalive_time = 300
    #net.ipv4.tcp_fin_timeout = 30
    #net.ipv4.tcp_max_tw_buckets =360000
    #net.ipv4.tcp_max_orphans =32768
    #net.ipv4.tcp_window_scaling =1
    #net.ipv4.tcp_timestamps =1
    #net.ipv4.tcp_rfc1337 =1

     

    参考:高负载系统,网络参数调整

    http://www.iteye.com/topic/624598

    调整/etc/sysctl.conf

    net.ipv4.tcp_syncookies = 1 
    表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;


    net.ipv4.tcp_tw_reuse = 1 
    表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;


    net.ipv4.tcp_tw_recycle = 1
    表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

    net.ipv4.tcp_fin_timeout = 30
    表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

    net.ipv4.tcp_keepalive_time = 1200
    表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

    net.ipv4.ip_local_port_range = 1024 65000
    表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。

    net.ipv4.tcp_max_syn_backlog = 8192
    表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。


    如果高负载系统使用了netfilter/iptables,调整以下参数
      

    net.ipv4.ip_conntrack_max = 655360
    在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目)


    net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
    跟踪的连接超时结束时间


    然后执行/sbin/sysctl -p让参数生效

     

    ===========================================================

     

     

    1.TCP连接的一方A发起终止请求,并更为FIN-WAIT-1状态。
    2.另一方B接受请求,并向返回确认,并更为CLOSE_WAIT
    3.当A接受到B返回的确认后,状态由FIN-WAIT-1变为FIN-WAIT-2
    4.A进入FIN-WAIT-2的定时器,这个时间就是由net.ipv4.tcp_fin_timeout设置的

    5.B会再次向A发送终止请求,并变更为LAST-ACT
    6.A接受请求,并向B返回确认,变更为TIME-WAIT
    7.B接受到A返回的确认后,关闭连接,变更为CLOSED
    8.A进入TIME-WAIT的定时器,超时后,连接终止,变更为CLOSED
    此时TCP连接正式关闭


    net.ipv4.tcp_fin_timeout设置的是FIN-WAIT-2状态的时间。
    如果FIN-WAIT-2超时,是不是就可以直接跳过5-8,即状态跳过TIME-WAIT,直接CLOSED?

    如果是这样,理论上说,设置为1,应该会有明显改善?
    可是测试的效果却几乎没有改善

  • 详谈--TCP三次握手四次挥手(转载)

    2011-11-09 18:27:54

    图片:

     

     

     

     

     

     

    tcp三次握手

     

    tcp四次挥手

     

     

    文档见附件: tcp_ip.rar(1.48 MB)

     

     

    参考文档:

    http://wenku.baidu.com/view/5d57cc63caaedd3383c4d3d6.html

    http://wenku.baidu.com/view/01fdda83e53a580216fcfee6.html

    http://wenku.baidu.com/view/cb80a84469eae009581bec95.html

    http://baike.baidu.com/view/7649.htm

     

    内核tcp/ip参数调整:

    http://www.iteye.com/topic/624598

    http://niyunjiu.iteye.com/blog/731404

    Linux内核 tcp/ip 调优:

    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.tcp_keepalive_time = 300
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.ip_local_port_range = 5000 65000
    net.ipv4.tcp_max_tw_buckets = 5000
    net.ipv4.tcp_max_syn_backlog = 2048
    net.ipv4.tcp_synack_retries = 2
    net.ipv4.tcp_syn_retries = 2

  • loadrunner 录制 cookie

    2011-11-09 18:20:59

     

    loadrunner 录制设置:

    作用:cookie登录

     

     

  • 代理服务器 Squid

    2011-10-28 16:51:26

     

    代理服务器 Squid

    软件下载:

    http://www.oschina.net/p/squid/

    Squid中文权威指南

    http://blog.s135.com/book/squid/

     

    Squid是什么,Squid工作原理是什么

     

    Squid是什么
      Squid是一种用来缓冲Internet数据的软件。它是这样实现其功能的,接受来自人们需要下载的目标(object)的请求并适当地处理这些请求。也就是说,如果一个人想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器(比如:http://squid.nlanr.net/)并向这个页面发出请求。然后,Squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据迅即就会传输到客户机上。当前的Squid可以处理 HTTP,FTP,GOPHER,SSL和WAIS等协议。但它不能处理如POP,NNTP,RealAudio以及其它类型的东西。
    Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。
    Squid 将数据元缓存在内存中,同时也缓存DNS查询的结果,除此之外,它还支持非模块化的DNS查询,对失败的请求进行消极缓存。Squid支持SSL,支持访问控制。由于使用了ICP(轻量Internet缓存协议),Squid能够实现层叠的代理阵列,从而最大限度地节约带宽。
    Squid由一个主要的服务程序squid,一个DNS查询程序dnsserver,几个重写请求和执行认证的程序,以及几个管理工具组成。当Squid启动以后,它可以派生出预先指定数目的dnsserver进程,而每一个dnsserver进程都可以执行单独的DNS查询,这样一来就大大减少了服务器等待DNS查询的时间。
      Internet缓冲的一些概念
      你可能会想到一些问题:缓冲有多大的用处?什么时候目标(object)应该或者不应该被缓冲?例如,缓冲信用卡号码是完全不适合的,脚本文件的执行结果在远程服务器端,站点经常更新(象www.cnn.com)或者甚至站点不允许缓冲,这些情况也都是不适合缓冲的。
      Squid处理各种情况是不错的(当然,这需要远程站点按标准形式工作)。
      可执行的cgi-bin脚本文件不被缓冲,返回正确页眉的页面是在一段限制了的时间内被缓冲,而且你可以规定特殊的规则以确定什么是可以或不可以被缓冲的,还有缓冲的时间为多长。
      谈到缓冲的用处有多大,这要看Internet的容量大小,各有不同。对于小型的缓冲区(几转磁盘空间)来说,返回值非常高(达到25%)。这个空间缓冲经常访问的站点,如netscape,cnn和其它一些类似情况的站点。如果你增加一倍缓冲的磁盘空间,但你不会成倍增加你的命中率。这是因为你开始缓冲网络中剩余部分时,这些通常时很大的而且很少被访问。一个非常大的高速缓冲区,有20转左右,可能返回值仍小于50%,除非你对保存数据的时间长短经常改变(一般地你不要分配20转的磁盘空间,因为页面很快就会过时,应该被删除掉)。
      我们在这里说的目标(object)指的是可保存的web页面或其它类似的可下载页面(ftp文件或目录内容也称为目标(object))。
      Squid运行在什么系统上?
      Squid可运行在大多数Unix和OS/2版本的系统之上,已知的可工作的有:
      AIX,Digital Unix,FreeBSD,HP-UX,Irix,Linux,NetBSD,Nextstep,SCO,Solaris

    SQUID如何工作
    [传统代理]
    1.SQUID被绑定到代理服务器的3128端口。
    2.客户端浏览器被配置使用代理服务器的3128端口。
    3.客户端不需要配置DNS。4.代理服务器上需要配置代理服务器。
    5.客户端不需要配置缺省路由。
    当我们在客户端浏览器中打开一个web请求,比如“http://www.96333.com”,这时将陆续发生以下事件:
    1.客户端使用某一端口(比如1025)连接代理服务器3128端口,请求web页面“http://www.96333.com”
    2.代理服务器向DNS请求“www.96333.com”,得到相应的IP地址2.3.4.5。然后,代理服务器使用某一端口(比如1037)向该IP地址的80端口发起web连接请求,请求web页面。
    3.收到响应的web页面后,代理服务器把该数据传送给客户端。
    4.客户端浏览器显示该页面。
    从www.96333.com的角度看来,连接是在1.2.3.4地1037端口和2.3.4.5的80端口之间建立的。
    从client的角度看来,连接是在192.168.1.100的1025端口和1.2.3.4的3128端口之间建立的。
    [透明代理]
    透明代理的意思是客户端根本不需要知道有代理服务器的存在。
    在以上基础上我们做以下工作:
    1.配置透明代理服务器软件运行在代理服务器的3128端口。
    2.配置代理服务器将所有对80端口的连接重定向到3128端口。
    3.配置客户端浏览器直接连解到Internet。
    4.在客户端配置好DNS.
    5.配置客户端的缺省网关为192.168.1.1.
    当我们在客户端浏览器中打开一个web请求,比如“http://www.96333.com”,这时将陆续发生以下事件:
    1.客户端向DNS请求“www.96333.com”,得到相应的IP地址2.3.4.5。然后,客户端使用某一端口(比如1066)向该IP地址的80端口发起web连接请求,请求web页面。
    2.当该请求包通过透明代理服务器时,被防火墙将该数据包重定向到代理服务器的绑定端口3128。于是,透明
    代理服务器用某一端口(比如1088)向2.3.4.5的80端口发起web连接请求,请求web页面。
    3.收到响应的web页面后,代理服务器把该数据传送给客户端。
    4.客户端浏览器显示该页面。
    从www.96333.com的角度看来,连接是在1.2.3.4地1088端口和2.3.4.5的80端口之间建立的。从client的角度看来,连接是在192.168.1.100的1066端口和2.3.4.5的80端口之间建立的。
    以上就是传统代理服务器和透明代理服务器的区别所在。
    [反向代理]
    反向代理是相对于传统代理而言,是代理web服务器接受客户端的请求。在此,我们忽略客户端的设置,假设客户端是可以直接访问互联网。
    web服务器与客户端的结构如下:
    假设已经将www.96333.com的域名指向了squid服务器所在的ip,并且在web服务器集群里做了dns轮询。
    web server1 -|
    web server2 -|- squid 服务器/ INTERNET / - Client
    web server3 -|
    1.客户端通过IE向DNS服务器发送访问www.96333.com的请求,由客户所在地的DNS服务器解析www.96333.com的IP为2.3.4.5并返回给用户。
    2.客户收到DNS返回的服务器IP地址,重新向www.96333.com指向的IP地址发送访问请求。
    3.squid 服务器接收到用户的请求后,查询自身缓存中是否有用户请求内容,有则直接发送给客户端,如果没有则通过内部DNS轮询查询空闲服务器,并将客户请求发送到该服务器,在获取到用户数据并返回给用户的同时保留一份在自己本身的缓存当中。在用户看来,自己访问的是www.96333.com这个服务器,实际上真正的WEB服务器为SQUID缓存后面的服务器或者服务器集群,通过外部DNS做CNAME转向,将用户请求转发到内部真正的web服务器上去。
     
    Squid工作原理是什么
    一、SQUID缓存的存放方式:
    每一台Squid 代理服务器上都有若干颗硬盘,每颗硬盘又分割成多个分区,每一个分区又可建立很多目录,目录下才放文件(Squid 把它叫object)。
    二、SQUID的查询方式:
    SQUID通过查询表的方式来定位某个资源的位置,所查询的表叫Hash table 和Digest table;Digest table在这里可以称之为摘要或者索引,它记录了磁盘上每个分区,每个目录里存的缓存摘要,Hash table在这里可以称之为目录或者提纲,它记录所有的Digest table表信息,SQUID接受到请求后先查询Hash table,在根据Hash table所指向的Digest table查询需要的信息。
    三、SQUID服务器之间的关系:
    SQUID服务器存在两种工作关系,一种为Child、Parent,当child squid server没有用户需要的数据时,就象parent server发出请求,并持续等待,直到parent server回应自己为止;另外一种为ibling,当本地SQUID server没有用户请求数据时,会向sibling server发出请求,如果sibling server没有资料则会向上级sibling或者INTERNET发送数据请求

    四、SQUID运作模式
    1. 当Squid Server 没有资料时,会先向Sibling 的Squid Server 要资料,如果Sibling没资料,就跳过它直接向Parent 要。
    2. 向Parent 要资料,然後一直等,直到Parent 给它资料为止(Parent 自己有的资料或上Internet 去拿)。
    3. 没有Parent 时,就自己上Internet 去拿。
    4. 如果这三者都拿不到资料,才向用户端回报拿不到资料。
    一般而言,把网路上一层的Squid Server 设成Sibling 是不错的选择(例如:一个学校将所在城市网和附近的大学设成Sibling),因为网路上一层的Squid Server 服务对象较多,其硬件功能较强,离我们比较近,速度也比较快;万一要不到资料,我们还可以自己上Internet 去拿。那什麽时候设Parent?当您的出口只有一个,或上一层Squid Server 拿不到资料,自己也一定拿不到,只好将上一层Squid Server 设为Parent。
    

    转自http://wuhaoshu.blog.51cto.com/845270/399781

    更多学习资料http://home.arcor.de/pangj/squid/index.html

     

     

    百度介绍:

    http://baike.baidu.com/view/490519.htm

     

     

    Squid是一种在Linux系统下使用的优秀的代理服务器软件。

      squid不仅可用在Linux系统上,还可以用在AIX、Digital Unix、FreeBSDHP-UXIrixNetBSDNextstepSCOSolaris等系统上。

      Squid与Linux下其它的代理软件如ApacheSocks、TIS FWTK和delegate相比,下载安装简单,配置简单灵活,支持缓存和多种协议。用ipchains+Squid的解决方案,就可以获得通过缓存高性能的同时能够无缝的访问Internet。

      Squid是一个缓存internet数据的一个软件,它接收用户的下载申请,并自动处理所下载的数据。也就是说,当一个用户想要下载一个主页时,它向Squid发出一个申请,要Squid替它下载,然后Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,使用户觉得速度相当快。

      对于Web用户来说,Squid是一个高性能的代理缓存服务器,可以加快内部网浏览Internet的速度,提高客户机的访问命中率。Squid不仅支持HTTP协议,还支持FTPgopherSSLWAIS等协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。

      Squid将数据元缓存在内存中,同时也缓存DNS查寻的结果,除此之外,它还支持非模块化的DNS查询,对失败的请求进行消极缓存。Squid支持SSL,支持访问控制。由于使用了ICP,Squid能够实现重叠的代理阵列,从而最大限度的节约带宽。

      Squid由一个主要的服务程序Squid,一个DNS查询程序dnsserver,几个重写请求和执行认证的程序,以及几个管理工具组成。当Squid启动以后,它可以派生出指定数目的dnsserver进程,而每一个dnsserver进程都可以执行单独的DNS查询,这样一来就大大减少了服务器等待DNS查询的时间。

      Squid的另一个优越性在于它使用访问控制清单(ACL)和访问权限清单(ARL)。访问控制清单和访问权限清单通过阻止特定的网络连接来减少潜在的Internet非法连接,可以使用这些清单来确保内部网的主机无法访问有威胁的或不适宜的站点。

      Squid对硬件的要求是内存一定要大,不应小于128M,硬盘转速越快越好,最好使用服务器专用SCSI 硬盘,处理器要求不高,400MH以上既可。

    squid配置

      squid是Linux下的一个代理服务器,本文限于篇幅,简单介绍一下squid配置,在文章结尾处提供一个squid配置的word文件供大家下载。

      代理服务器原理

      代理服务器接受到请求后,首先与访问控制列表中的访问规则相对照,如果满足规则,则在缓存中查找是否存在需要的信息。

      客户端B向代理服务器提出相同的请求。代理服务器也首先与访问控制列表中的访问规则相对照。如果满足规则,则将缓存中的信息传送给客户端B

      squid简介

      访问控制清单和访问权限清单通过阻止特定的网络连接来减少潜在的Internet非法连接,可以使用这些清单来确保内部网的主机无法访问有威胁的或不适宜的站点。

      以下是一些squid的基本配置参数解释

      http_port 3128 //设置监听的IP与端口号

      cache_mem 64 MB //设置内存缓冲的大小

      cache_dir ufs /var/spool/squid 2000 16 256 //设置硬盘缓冲大小

      cache_effective_user squid //设置缓存的有效用户

      cache_effective_group squid //设置缓存的有效用户组

      dns_nameservers 192.168.0.254 //设置DNS服务器地址,一般可以不设置,默认使用服务器自己设置的dns

      cache_access_log /var/log/squid/access.log //设置访问日志文件

      cache_log /var/log/squid/cache.log //设置缓存日志文件

      visible_hostname 192.168.0.20 //设置squid主机名称

      以上全局参数根据你自己的需要修改

      其实linux下的服务器配置文件最好就是squid,它对每个参数都有解释,而且很多有很多实例

      Acl的访问控制列表

      语法:acl 列表名称 列表类型 [-i] 列表值

      列表名称:用于区分Squid的各个访问控制列表,任何两个访问控制列表不能用相同的列表名。虽然列表名称可以随便定义,但为了避免以后不知道这条列表是干什么用的,应尽量使用有意义的名称,如badurl、clientip和work time等。

      列表类型:是可被Squid识别的类别。Squid支持的控制类别很多,可以通过IP地址、主机名、MAC地址和用户/密码认证等识别用户,也可以通过域名、域后缀、文件类型、IP地址、端口和URL匹配等控制用户的访问,还可以使用时间区间对用户进行管理

      -i选项:表示忽略列表值的大小写,否则Squid是区分大小写的。

      列表值:针对不同的类型,列表值的内容是不同的。例如,对于类型为src或dst,列表值的内容是某台主机的IP地址或子网地址;对于类型为time,列表值的内容是时间;对于类型为srcdomain和dstdomain,列表值的内容是DNS域名。

    squid常用调试命令

      1、初始化你在 squid.conf 里配置的 cache 目录

      #squid/sbin/squid -z //第一次启动squid服务时必须输入此命令

      如果有错误提示,请检查你的 cache目录的权限。

      2、对你的squid.conf 排错,即验证 squid.conf 的 语法和配置。

      #squid/sbin/squid -k parse

      如果squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,恭喜,可以尝试启动squid。

      3、在前台启动squid,并输出启动过程。

      #squid/sbin/squid -N -d1

      如果有到 ready to server reques,恭喜,启动成功。

      然后 ctrl + c,停止squid,并以后台运行的方式启动它。

      4、启动squid在后台运行。

      #squid/sbin/squid -s

      这时候可以 ps -A 来查看系统进程,可以看到俩个 squid 进程。

      5、停止 squid

      #squid/sbin/squid -k shutdown

      这个不用解释吧。

      6、重引导修改过的 squid.conf

      #squid/sbin/squid -k reconfigure

      这个估计用的时候比较多,当你发现你的配置有不尽你意的时候,可以随时修改squid.conf,然后别忘记对你的 squid.conf排错,然后再执行此指令,即可让运行中squid重新按照你的squid.conf 来运行。

      7、把squid添加到系统启动项

      编辑 /etc/rc.d/rc.local

      添加如下行: /usr/local/squid/sbin/squid -s

      当然,并不是每个人都喜欢这种启动方式,你可以用你最习惯的方式;或者把它安装为服务。

      再来点其他的。

      1、修改cache 缓存目录的权限。

      #chown -R squid:squid /home/cache

      我的cache缓存目录是 /home/cache,squid执行用户和用户组是 squid,squid。

      2、修改squid 日志目录的权限

      #chown -R squid:squid /usr/local/squid/var/logs

      这一步并不是适合每一个使用squid的用户.意为让squid有权限在该目录进行写操作 。

      例如生成 access.log cache.log store.log

      3、查看你的日志文档。

      #more /usr/local/squid/var/logs/access.log | grep TCP_MEM_HIT

      该指令可以看到在squid运行过程中,有那些文件被squid缓存到内存中,并返回给访问用户。

      #more /usr/local/squid/var/logs/access.log | grep TCP_HIT

      该指令可以看到在squid运行过程中,有那些文件被squid缓存到cache目录中,并返回给访问用户。

      #more /usr/local/squid/var/logs/access.log | grep TCP_MISS

      该指令可以看到在squid运行过程中,有那些文件没有被squid缓存,而是现重原始服务器获取并返回给访问用户。

      关于 TCP_XXXX 等参数及代表的信息,请参看彭勇华《squid中文权威指南》13.2.1 章节。

      当然,本例中的蓝色文字是可以修改为其他的参数,例如你的域名,同样可以看到access.log里关于该域名的行。

      4、squid -k rotate 轮换squid的日志文件/var/log/squid,Squid代理服务器日志文件

      的增长速度是惊人的,很容易点球满磁盘空间导致系统不能正常工作,甚至是死机.为了解决日志文件增长太快的问题,squid采用了"轮换"的方法.在squid.conf中可以通过logfile_rotate来设置文件轮换的个数,如:

      logfile_rotate 10 ,轮换的工作一般用crontab定时器完在周期性的日志轮换,例如每周六凌晨2:00进行日志轮换,则执行如下命令: crontab -e

      0 2 * * 6 squid -k rotate

      小贴士:Squid默认的错误提示信息为英文,对于英文不好的用户来说,实在不方便.在/etc/squid/squid.conf里添加如下:

      error_directory /usr/share/squid/errors/Simplify_Chinese 即可显示中文的错误提示。

     

  • 1

    squid配置:http://www.linux520.net/9_147_zh.html

  • 2

    <http://fanqiang.chinaunix.net/a6/b6/20010626/170400681.html(Squid-Linux下的使用详解)

  • 3

    http://www.williamgibsonbooks.com(威廉·吉布森主页)

  • free mind on line

    2011-10-28 15:11:29

    chrome浏览器:

    http://www.mindmeister.com

    http://www.mindmeister.com/maps/show/79393123

  • LoadRunner/C/java 二进制转换

    2011-10-28 10:46:11

    LoadRunner/C 二进制转换

    LoadRunner输出二进制流,同理处理8进制、16进制:

    void Main()
    {
    char   buff[20];  

    change(100,2,buff);  
    lr_output_message("%s\n",buff);  
    change(100,8,buff);  
    lr_output_message("%s\n",buff);  
    change(100,10,buff);  
    lr_output_message("%s\n",buff);  
    change(100,16,buff);  
    lr_output_message("%s\n",buff);  
    }



    char   *change(int   val,   int   base,   char   *retbuf   )  
    {  
    static   char         *str   =   "0123456789ABCDEF";  
    char   *p;  
    char   buf[15];  

    p   =   buf+14;  
    *p   =   0;  

    do   {   *--p   =   str[val   %   base];   }   while(   val   /=   base   );  
    strcpy(retbuf,p);  
    return   retbuf;  
    }


    输出就不打印了,运行一下就知了。

    另外还有一种简单的方法,直接用itoa或strtol转换:

    void Main()
    {


        char dnum[40]="测试";
        char cnum[32];


        itoa(dnum,cnum,2);
        lr_output_message("the binary number is:%s",cnum);     
    return 0; 
    }

       

     

    http://blog.csdn.net/gzh0222/article/details/6644371

     

    JAVA中实现十进制与其它自定义进制进行相互转换。  

     

     

    我们通常用到的数字都是十进制的,日常使用的也是这样,但是在程序中,我们可能还会经常用到二进制、八进制、十六进制的数字。既然程序中会使用到,那么就会有它存在的道理。有些时候,将数字用字符串保存到文件或者数据库中,你会发现,十进制的64在二进制中表示为1000000,在八进制中表示为100,在十六进制中表示为40。于是,需要将64存储到文件或者数据库中,用二进制表示的话占用了7个字符长度,八进制占了3个字符长度,而十进制、十六进制都只用了2个字符长度,可以看出,如果要使用最想的空间来存储一个普通的十进制数字,只要使用更高的进制表示就可以节省更多的空间。现在,我们完全可以自定义属于自己的进制表示,可以是N进制,当然N会有一定的限制。

      下面的源代码给出了自定义进制转换的方法:
     /**
      * 在进制表示中的字符集合。
      */
     final static char[] digits = {
      '0' , '1' , '2' , '3' , '4' ,'5' ,
      '6' , '7' , '8' , '9' , 'a' ,'b' ,
      'c' , 'd' , 'e' , 'f' , 'g' ,'h' ,
      'i' , 'j' , 'k' , 'l' , 'm' ,'n' ,
      'o' , 'p' , 'q' , 'r' , 's' ,'t' ,
      'u' , 'v' , 'w' , 'x' , 'y' ,'z'
     };
     /**
      * 将十进制的数字转换为指定进制的字符串。
      * @param i 十进制的数字。
      * @param system 指定的进制,常见的2/8/16。
      * @return 转换后的字符串。
      */
     public String toCustomNumericString(int i, intsystem) {
      long num = 0;
      if (i < 0) {
       num =((long)2 * 0x7fffffff) + i + 2;
      } else {
       num =i;
      }
      char[] buf = newchar[32];
      int charPos = 32;
      while ((num / system) > 0){
       buf[--charPos]= digits[(int)(num % system)];
       num /=system;
      }
      buf[--charPos] =digits[(int)(num % system)];
      return new String(buf, charPos,(32 - charPos));
     }
     
     /**
      *将其它进制的数字(字符串形式)转换为十进制的数字。
      * @param s 其它进制的数字(字符串形式)
      * @param system 指定的进制,常见的2/8/16。
      * @return 转换后的数字。
      */
     public int toCustomNumeric(String s, int system){
      char[] buf = newchar[s.length()];
      s.getChars(0, s.length(), buf,0);
      long num = 0;
      for (inti=0;i<buf.length;i++) {
       for (intj=0;j<digits.length;j++) {
        if(digits[j] == buf[i]) {
         num+= j * Math.pow(system, buf.length - i -1);
         break;
        }
       }
      }
      return (int)num;
     }
     
      从上面的代码中可以看出,由于受到digits字符数量的限制,现在能够实现的最大自定义进制只有36进制,如果想要构造更大的进制表示,我们可以扩充digits中的字符。当然不能自己构造一个一进制、零进制的数字。
      下面的一个方法是JDK中的标准类库提供的方法,它在性能上有很大的提高,毕竟用到了位运算,而不是简单的比较。
    private static String toUnsignedString(int i, int shift){
      char[] buf = newchar[32];
      int charPos = 32;
      int radix = 1 <<shift;
      int mask = radix - 1;
      do {
         buf[--charPos] = digits[i & mask];
         i >>>= shift;
      } while (i != 0);
      return new String(buf,charPos, (32 - charPos));
     }
      由于用到了位移操作,所以它的进制表示只是局限于2/4/8/16/32,其它的就不能实现了。当shift为1时,表示二进制;当shift为2时,表示四进制;依次类推。
     
    http://yz124.blog.163.com/blog/static/36663682006112102813233/
  • 【转】水浒—梁山好汉武功排行

    2011-10-20 14:01:46


    【转】水浒—梁山好汉武功排行

    水浒群雄的武功排行比起三国群英来要复杂许多,首先是出场人物众多,尤其是招安之后,高手走马灯般上阵,令人眼花缭乱;其次是功夫种类繁杂,不光只 有马上对阵一种,还出现了武林侠客的打法——拳击格斗,以及各种怪力乱神的妖法、暗器等旁门左道。因此,水浒群雄的武功高下比较起来,颇有些难度。 

    【转】水浒鈥斄荷胶煤何涔ε判

       网络图:水浒群英


      为了便于比较,还是先从梁山好汉说起。法术、暗器和水下功夫暂且不表,单以马上马下的武功论,梁山一百单八将大致有一个现成的排行: 


       
      马上,当以玉麒麟卢俊义为首,此人身高九尺,惯使一条棍棒,天下无对,曾头市一战,力擒史文恭(史文恭只用二十回合就打败秦明);招安之后,力敌耶律 四将不怯(四将武功都不弱,曾分别对阵关胜、呼延灼、徐宁、索超,虽回数不多,但未分胜负),并诛杀一人,击退三人;百战孙安;活捉卞祥;枪挑厉天闰,除 与王庆手下之金剑先生李助交手时,处于下风以外,未曾一败,可谓武功盖世,是整部水浒中的顶级高手之一,功夫远胜梁山五虎将。 
       
      接下来是五虎将——大刀关胜、豹子头林冲、双鞭呼延灼、双枪将董平、霹雳火秦明。其中关胜、林冲较后三人,技高一筹,招安之后,每遇劲敌,非此二人出 战不可,对战敌将无数,未有败绩;然后是呼延灼和董平,呼延灼防守能力极强,基本上没有败绩。董平进攻能力似较呼延灼略高一点,但防守能力不及,多次处于 险境之中;五虎将里武功最末的是秦明,与敌交手,胜绩不少,但败绩更多,最差战绩是二十回合败给史文恭,二十回合被栾廷玉所擒,其真实功力可能只与八骠骑 之花荣、徐宁、杨志相仿佛。 
       
      梁山五虎将之后,便是八骠骑——小李广花荣、青面兽杨志、金枪手徐宁、九纹龙史进、急先锋索超、没羽箭张清、美髯公朱仝和没遮拦穆弘,还有两位与八骠 骑武功相当的,即扑天雕李应和病尉迟孙立。这十个人武功大致在一个档次,花荣、杨志、徐宁、史进、孙立略高半筹;张清暗器无敌,但枪法一般;穆弘基本上没 什么突出表现,应该算是这一组里武功最弱的。 
       
      马下,当以鲁智深和武松为首,接下来依次是赤发鬼刘唐、病关索杨雄、浪子燕青、拼命三郎石秀、插翅虎雷横和黑旋风李逵。水浒传里凡遇到马下与马上对阵 时,马下都很吃亏,只有鲁智深和武松具有正面抗衡马军将领的能力,二人武功大致与五虎将相当;刘唐、杨雄、燕青与八骠骑相若;石秀、雷横、李逵较八骠骑稍 弱。 
       
      鲁智深其人面圆耳大,鼻直口方,腮边貉腮胡须,身长八尺,腰润十围,力大无穷,手使六十二斤重水磨禅杖,上山之前曾拳打镇关西、大闹五台山、大闹桃花 村、火烧瓦罐寺、倒拔垂杨柳、大闹野猪林、单打二龙山;招安之后,活捉马灵,大战邓元觉,生擒方腊,屡立奇功。三山聚义打青州时,曾在马上与呼延灼大战五 十回合不分胜负,使得呼延灼心里暗赞这和尚功夫了得,马上对战非鲁智深所长,却能与呼延灼打成平手,若在马下,胜呼延灼不在话下; 
       
      武松其人身躯魁梧,壮健非常,力大无比,曾于景阳冈徒手毙虎,还曾轻易举起天王堂前四五百斤石墩,掷高一丈后轻松接住;斗杀西门庆,醉打蒋门神,用了 玉环步、鸳鸯脚等武林绝学;大战飞天蜈蚣王道人,以双刀胜双剑。招安之后,还曾三次只用一招便斩了马上之将,可见,武松是真正的武林高手,可称梁山步战第 一人; 
       
      以上二十四位,便是梁山好汉里武功最高的二十四人,按武功高低大体排行应为:卢俊义、关胜、林冲、鲁智深、武松、呼延灼、董平、秦明、花荣、杨志、徐 宁、孙立、史进、索超、李应、朱仝、张清、刘唐、杨雄、燕青、石秀、穆弘、雷横、李逵。其中,卢俊义是顶级高手;五虎将和鲁智深、武松是超一流高手;剩下 的十六人,可归为一流高手行列。 
       
      梁山有一百单八将之众,却也未能囊括天下英雄。正所谓天外有天,人外有人,梁山之外,依旧是高手如云。接下来,我们以秦明为界,看看整部水浒中,武功胜过秦明的超一流高手,都有哪些。按照出场先后,逐个加以评说:    
       
      A:七十回之前,梁山之外的高手共有三位,分别是:王进、栾廷玉和史文恭: 
       
      王进:原为东京八十万禁军教头,因得罪高俅,带母私走延安府,路过史家村时,一合即打败史进,后做了史进的师傅,史进跟其学了半年功夫,便十八般武艺样样精通,名列梁山八骠骑之一。必有名师,方出高徒,王进虽然未与水浒中其他高手交过手,但据此来看,此人武功绝不下于林冲; 
       
      栾廷玉:祝家庄的武术教师,善使铁棒,号称“铁棒奕廷玉”,江湖闻名。与秦明战,只一二十合便将秦明用绊马索拿了。如此武功,与秦明同列五虎将的关胜、林冲,当然无法做到; 
       
      史文恭:曾头市的武术教师,此人骑照夜玉狮子马,手使一支方天画戟,武功超群,枪法出众,勇猛无比。与秦明战,约二十余合,秦明败阵,走时被史文恭一枪刺在腿股上,吕方、郭盛、马麟、邓飞四将齐出死命来救秦明,却也抵挡不住史文恭。后被卢俊义活捉。 
           
      B:十节度使征讨梁山时,武功出色的有四位,依次是:王焕、韩存保、项元镇和张开: 
       
      王焕:河南河北节度使,与林冲大战七、八十合,未分胜负; 
       
      韩存保:云中门节度使,与呼延灼从马上打到马下,旗鼓相当,难分高下; 
       
      项元镇:琅琊彭城节度使,与董平战约十合左右,瞅准时机,箭射董平右臂,致使董平弃枪逃归本阵。据此看,其武功射功应比花荣略胜之; 
       
      张开:中山安平节度使,战张清,马上这条枪,神出鬼没,张清只有招架之功(张清飞石厉害,枪法却只一般),没有还手之力,拖了枪,便走入马军队里躲闪。张开枪马到处,杀得五六十马军,四分五落。此人武功应与秦明相当。 
           
      C:辽国高手:招安之后,梁山奉诏征讨大辽,遇到辽国众多高手,其中最厉害的三位是阿里奇、兀颜光和琼妖纳延: 
       
      阿里奇:辽国檀州守将,手拈梨花点钢枪,坐骑银色拳花马,有万夫不当之勇。徐宁与之战,三十余合即败走。能在三十回合杀败徐宁,此人武功在五虎将之上,略低于史文恭和栾廷玉。后被张清用石子打中左眼落马,被擒杀; 
         
      兀颜光:辽国第一上将,十八般武艺,无有不通,兵书战策尽皆闲熟。上阵时,仗条浑铁点钢枪杀到浓处,不时擎出腰间铁筒,使得铮铮有声,端的是万夫不当之勇。后来在混天象阵里,被关胜、花荣和张清联手斩杀,关胜武功,梁山第二,花荣、张清是梁山暗器最厉害的两位,三人联手方能诛杀兀颜光,可见此人武功之高。 
       
      琼妖纳延:辽国兀颜统军座下先锋,三十回合杀退史进。 
           
      D:田虎手下,高手有二,孙安、卞祥: 
       
      孙安:田虎手下殿帅,身长九尺,腰大八围,颇知韬略,臂力过人,学得一身出色的好武艺,惯使两口镔铁剑。与秦明斗五六十回合不分胜负,又与卢俊义斗五 十余合,忽马失前踢,孙安颠下马,卢俊义令其换马再战。五十余合后,卢俊义佯败,孙安被绊马锁绊倒,活捉归顺后,助卢俊义斩杀杜壆; 
       
      卞祥:田虎手下太师,庄稼出身,两条臂膊水牛般气力,武艺精熟,金冠银甲,身长九尺,跨匹冲波战马,提开山大斧。史进曾与卞祥战三十余合,花荣拍马提 枪助战,二打一又战三十余合无胜败,各自收兵。后被卢俊义活捉。后宋江亲释其缚,以礼相待,遂感激归降。攻打王庆时,卞祥见山士奇斗不过酆泰,拈枪拍马助 战,大喝一声,一枪刺中酆泰心窝,死于马下。 
          
      E:王庆手下,高手有四位,袁朗、杜壆、酆泰、李助: 
       
      袁朗:王庆手下将领,骑一匹卷毛乌骓,两个水磨炼钢挝,左手十五斤,右手十六斤,与秦明战,一百五十余合不分胜负; 
       
      杜壆:王庆手下将领,身高八尺又八,威风凛凛,自幼练得好武艺,与卢俊义交战,五十余合不分胜负,手中那条丈八蛇矛枪神出鬼没。孙安见卢俊义不能取胜,舞剑拍马助战,杜壆措手不及,被一剑砍断右臂,翻身落马,卢俊义再一枪结果了性命; 
       
      酆泰:王庆手下将领,身材魁梧,膂力过人,能征贯战。与山士奇战,斗到十合以上,卞祥见山士奇斗不过酆泰,拈枪拍马助战,被酆泰大喝一声,只一简,把 山士奇打下马来,再一简,结果了性命,山士奇原是田虎手下,曾与林冲斗五十回合不分胜负,据此情形看,山士奇武功应与杨志相若,却被酆泰十几回合斩杀,由 此看,酆泰武功只会在林冲之上,不会在林冲之下; 
       
      李助:王庆军师,号金剑先生,剑术无敌,一把剑舞将起来,如掣电一般,此人是全书中惟一一位单打独斗让卢俊义抵挡不住的人物,后被公孙胜用法术制服。 
           
      F:方腊手下,高手有六位:邓元觉、石宝、司行方、厉天闰、方杰、王寅: 
       
      邓元觉:方腊手下宝光如来国师,使浑铁禅杖,重五十余斤。鲁智深与邓元觉斗五十余合不分胜负,武松见鲁智深战宝光不下,恐有疏失,心中焦躁,飞出阵来助战,邓望城里便走。后与秦明交战五六合,见秦明输了,径奔来捉宋江,被花荣一箭射落马下,被众军杀死; 
       
      石宝:方腊手下南离大将军元帅,福州人氏,惯使一个流星锤,百发百中,又能使一口宝刀,名为“劈风刀”,可以裁铜截铁,遮莫三层铠甲,如劈风一般过 去。曾锤打八骠骑之一骁将急先锋索超;战吕方、郭盛两枝戟,没半分漏泄,直至又加上朱仝一条枪,才败走。遇关胜,不敢恋战,关胜也不敢轻取; 
       
      司行方:方腊手下护国大将军,三十回合砍杀雷横; 
       
      厉天闰:方腊手下镇国大将军,破单手董平与张清的联手,刺死张清; 
       
      方杰:方腊侄儿,惯使一枝方天通戟,有万夫不当之勇。与秦明战三十余合不分胜负,杜微背后飞刀,秦明闪时被方杰杀死。关胜与方杰战十数合,花荣又上, 方杰力敌二将全无惧色,又战数合,难见输赢,却只没遮拦躲避,李应、朱仝再上,方杰才退,却不防被附马柯引(紫进)一枪戳着,燕青一刀结果其性命; 
       
      王寅:方腊手下兵部尚书,此人惯使一条钢枪,坐下有一骑好马,名唤“转山飞”,登山渡水,如行平地。李云、石勇数合死于王寅枪下。孙立、黄信、邹渊、邹润四将与王寅撕杀,那王寅奋勇力敌四将,并无惧怯。不想又撞出林冲赶到,一并围战,被乱戮而杀。 
       
      至此,我们可以得出整部水浒中超一流高手前三十名的排行如下: 
       
      1、李助:剑法高明,一对一,让卢俊义抵挡不住; 
      2、卢俊义:擒史文恭;胜耶律四将;胜孙安;擒卞祥;枪挑厉天闰; 
      3、方杰:刺死秦明;力敌关胜、花荣联手而不惧,李应、朱仝再上,方杰才退; 
      4、兀颜光:辽国第一猛将,梁山武功第二的关胜,加上暗器最厉害的花荣、张清,方才将其斩杀; 
      5、王寅:力敌孙立、黄信、邹渊、邹润四将而不败,加上林冲才将其刺死; 
      6、史文恭:射杀晁盖;二十回合胜秦明;吕方、郭盛、马麟、邓飞四将齐出,亦敌不住; 
      7、卞祥:力敌史进、花荣联手,三十回合而不败;斩杀功夫在林冲之上的酆泰; 
      8、栾廷玉:二十回合擒秦明; 
      9、杜壆:与卢俊义对战五十回合而不败; 
      10、王进:八十万禁军教头,半年之内教会史进十八般武艺; 
      11、酆泰:十几回合即斩杀与林冲对阵五十回合不分胜负的山士奇; 
      12、关胜:梁山五虎将之首,十回合杀得索超斧怯;征方腊时,斩将颇多; 
      13、石宝:诛杀梁山好汉多名:马麟、燕顺、索超、邓飞、鲍旭等都命丧其手;与关胜棋逢对手; 
      14、阿里奇:三十回合击败徐宁; 
      15、林冲:梁山五虎将排名第二,对敌无数,未曾一败,其实际功夫应与关胜伯仲之间; 
      16、鲁智深:倒拔垂杨柳,力逾千钧。马上对阵呼延灼五十回合不分胜负,马下与邓元觉打成平手; 
      17、邓元觉:与鲁智深对战不分胜负; 
      18、武松:徒手毙虎,斗杀西门庆,醉打蒋门神,刀砍飞天蜈蚣,还曾三次,马下对马上一招斩将; 
      19、王焕:与林冲对战七十回合未分胜负; 
      20、司行方:三十回合斩杀雷横; 
      21、琼妖纳延:与史进战,处于上风,三十回合吓退史进; 
      22、呼延灼:与林冲、鲁智深、孙立、杨志对战,均不分胜负,其防守能力胜于进攻能力,征辽时,曾活捉兀颜延寿; 
      23、韩存保:与呼延灼对战,打成平手; 
      24、厉天闰:单手董平与张清联手,不敌厉天闰; 
      25、孙安:与秦明斗五六十合不分胜负,又与卢俊义斗五十合,后被卢俊义所擒,功夫当在秦明之上,卢俊义之下; 
      26、项元镇:对阵董平十回合后,箭射董平右臂; 
      27、张开:杀得张清落荒而逃; 
      28、董平:与徐宁交战五十回合,不分胜负,但处在上风;征辽时枪挑辽国大将耶律国珍; 
      29、秦明:勇猛无比,性如烈火,单挑次数在梁山数一数二,但防守能力较差,曾先后败于顶尖高手栾廷玉、史文恭和方杰之手;论武功,当为梁山五虎将之末; 
      30、袁朗:对阵秦明一百五十回合不分胜负。






  • LoadRunner User Manual \ COOKIES介绍

    2011-10-19 15:08:53

    COOKIES介绍

     

    Windows 9X系统计算机中,Cookies文件的存放位置为C:WindowsCookies,在Windows NT/2000/XP的计算机中,Cookies文件的存放位置为C:\Documents and Settings\用户名\Cookies。

    硬盘中的Cookies文件可以被Web浏览器读取,它的命令格式为:用户名@网站地址[数字].txt。如笔者计算机中的一个Cookies文件名为:ch@163[1].txt。要注意的是:硬盘中的Cookies属于文本文件,不是程序。

    Cookies的设置

    你可以在IE的“工具/Internet选项”的“常规”选项卡中,选择“设置/查看文件”, 查看所有保存到你电脑里的Cookies。这些文件通常是以user@domain格式命名的,user是你的本地用户名,domain是所访问的网站的 域名。如果你使用NetsCape浏览器,则存放在“C:PROGRAMFILESNETS- CAPEUSERS”里面,与IE不同的是,NETSCAPE是使用一个Cookie文件记录所有网站的Cookies。

    我们可对Cookie进行适当设置:打开“工具/Internet选项”中的“隐私”选项卡 (注意该设置只在IE6.0中存在,其他版本IE可以单击“工具/Internet选项”“安全”标签中的“自定义级别”按钮,进行简单调整),调整 Cookie的安全级别。通常情况,可以调整到“中高”或者“高”的位置。多数的论坛站点需要使用Cookie信息,如果你从来不去这些地方,可以将安全 级调到“阻止所有 Cookies”;如果只是为了禁止个别网站的Cookie,可以单击“编辑”按钮,将要屏蔽的网站添加到列表中。在“高级”按钮选项中,你可以对第一方 Cookie和第三方的Cookie进行设置,第一方Cookie是你正在浏览的网站的Cookie,第三方Cookie是非正在浏览的网站发给你的 Cookie,通常要对第三方Cookie选择“拒绝”。你如果需要保存Cookie,可以使用IE的“导入导出”功能,打开“文件/导入导出”,按提示 操作即可。

    Cookies的写入与读取

    Cookies集合是附属于Response对象及Request对象的数据集合,使用时需要在前面加上Response或Request。

    用于给客户机发送Cookies的语法通常为:

    当给不存在的Cookies集合设置时,就会在客户机创建,如果该Cookies己存在,则会被代替。由于Cookies是作为HTTP传输的头信息的一部分发给客户机的,所以向客户机发送Cookies的代码一般放在发送给浏览器的HTML文件的标记之前。

    如果用户要读取Cookies,则必须使用Request对象的Cookies集合,其使用方法是:

    需要注意的是,只有在服务器未被下载任何数据给浏览器前,浏览器才能与Server进行 Cookies集合的数据交换,一旦浏览器开始接收Server所下载的数据,Cookies的数据交换则停止,为了避免错误,要在程序和前面加上 response.Buffer=True。

    Cookies的应用

    几乎所有的网站设计者在进行网站设计时都使用了Cookie,因为他们都想给浏览网站的用户提供一个更友好的、人文化的浏览环境,同时也能更加准确地收集访问者的信息。

    网站浏览人数管理

    由于代理服务器、缓存等的使用,唯一能帮助网站精确统计来访人数的方法就是为每个访问者建立一个唯一的ID。使用Cookie,网站可以完成以下工作:测定多少人访问过;测定访问者中有多少是新用户(即第一次来访),多少是老用户;测定一个用户多久访问一次网站。

    通常情况下,网站设计者是借助后台数据库来实现以上目的的。当用户第一次访问该网站时,网站在数据库中建立一个新的ID,并把ID通过Cookie传送给用户。用户再次来访时,网站把该用户ID对应的计数器加1,得到用户的来访次数或判断用户是新用户还是老用户。

    按照用户的喜好定制网页外观

    有的网站设计者,为用户提供了改变网页内容、布局和颜色的权力,允许用户输入自己的信息,然后通过这些信息对网站的一些参数进行修改,以定制网页的外观。

    在电子商务站点中实现诸如“购物篮”等功能

    可以使用Cookie记录用户的ID,这样当你往“购物篮”中放了新东西时,网站就能记录下来,并在网站的数据库里对应着你的ID记录当你“买单”时,网站通过ID检索数据库中你的所有选择就能知道你的“购物篮”里有些什么。

    在一般的事例中,网站的数据库能够保存的有你所选择的内容、你浏览过的网页、你在表单里填写的信息等;而包含有你的唯一ID的Cookie则保存在你的电脑里。

    Cookies的缺陷

    Cookie虽然被广泛的应用,并能做到一些使用其它技术不可能实现的功能。但也存在一些不够完美的方面,给应用带来不便。

    多人共用一台电脑的问题

    任何公共场合的电脑或者许多在办公室或家里使用的电脑,都会同时被两个以上的人使用。这样,当 你用它在网上超市购物时,网上超市或网站会在这台机器上留下一个Cookie,将来也许就会有某个人试图使用你的账户购物,带来了不安全的可能。当然,在 一些使用多用户操作系统如Windows NT或UNIX的电脑上,这并不会成为一个问题。因为在多用户操作系统下不同的账户的Cookie分别放在不同的地方。

    Cookies被删除时

    假如你的浏览器不能正常工作,你可能会删除电脑上所有的临时Internet文件。然而,一旦 这样操作以后,你就会丢掉所有的Cookies文件。当你再次访问一个网站时,网站会认为你是一位新用户并分配给你一个新的用户ID以及一个新的 Cookie。结果将会造成网站统计的新老用户比发生偏差,而你也难以恢复过去保存的参数选择。

    一人使用多台电脑时

    有的人一天之中经常使用一台以上的电脑。例如在办公室里有一台电脑、家里有一台、还有移动办公 用的笔记本电脑。除非网站使用了特别的技术来解决这一问题,否则,你将会有三个不同的Cookies文件在这三台机器上,而在三台机器上访问过的任何网站 都将会把你看成三个不同的用户。

    防范Cookies泄密

    想知道你访问的网站是否在你的硬盘或内存中写入了Cookies信息吗?只需执行下面的操作步骤,就可以了解和控制你正在访问的网站的Cookies信息。

    步骤一 点击IE窗口中的“工具” “Internet选项”,打开“Internet选项”设置窗口;

    步骤二 点击“Internet选项”设置窗口中的“安全”标签,然后再点击“自定义级别”按钮,进入“安全设置”窗口;

    步骤三找到“安全设置”窗口中的“Cookies”设置项。“Cookies”设置项下有两个 分选项,其中“允许使用存储在您计算机上的Cookies”是针对存储在用户计算机硬盘中的Cookies文件;“允许使用每个对话Cookies(未存 储)”是针对存储在用户计算机内存中的Cookies信息。存储在硬盘中的Cookies文件是永久存在的,而存储在内存中的Cookies信息是临时 的。要想IE在即将接收来自Web站点的所有Cookies时进行提示,可分别选择上面两个分选项中的“提示”项。当然,你也可以选择“启用”,允许IE 接受所有的Cookies信息(这也是IE的默认选项);选择“禁止”,则是不允许Web站点将Cookies存储到您的计算机上,而且Web站点也不能 读取你计算机中已有的Cookies。

    IE6.0提供了更为可靠的个人隐私及安全保护措施,可以让用户来控制浏览器向外发送信息的多 少。在“Internet 选项”窗口中新增了“隐私”选项卡(图1),用户可以在其中直接设置浏览时的隐私级别,按需要控制其他站点对自己电脑所使用的Cookies。如果我们正 在浏览的站点使用了Cookie,那么在浏览器状态栏中会有一个黄色惊叹号的标记,双击后可打开“隐私报告”对话框,用户可以在其中查看具体的隐私策略, 还可直接点击“设置”按钮后在上述“隐私”选项卡中调节安全隐私级别。

    在“常规”选项卡中还增加了“删除Cookies”按钮(图2),方便用户直接清除本机上的 Cookies。另外,在“工具” “选项” “高级”选项卡中也增加了一些进一步提高安全性的选项(如关闭浏览器时清空Internet临时文件)。其实,如何更好地保护个人隐私和安全是微软下一代 “.NET”战略软件中的关键技术,现在IE6.0已经尝试着迈出了第一步。

    另外,由于Cookies的信息并不都是以文件形式存放在计算机里,还有部分信息保存在内存 里。比如你在浏览网站的时候,Web服务器会自动在内存中生成 Cookie,当你关闭IE浏览器的时候又自动把Cookie删除,那样上面介绍的两种方法就起不了作用,我们需要借助注册表编辑器来修改系统设置。要注 意的是,修改注册表前请作备份,以便出现问题后能顺利恢复。

    运行Regedit,找到如下键值:HKEY_LOCAL_MACHINE\Software \Microsoft\Windows\CurrentVersion\ Internet\ SettingsCacheSpecial PathsCookies,这是Cookies在内存中的键值,把这个键值删除。至此Cookies无论以什么形式存在,我们都不用再害怕了。(注:新版 本Windows可能已经不在此注册表目录下)

    最后有必要说明的一点是:杜绝Cookies虽然可以增强你电脑的信息安全程度,但这样做同样会有一些弊端。比如在一些需要Cookies支持的网页上,会发生一些莫名其妙的错误,典型的例子就是你以后不能使用某些网站的免费信箱了。

    Cookies欺骗

    通过分析Cookie的格式,我们知道,最后两项中分别是它的URL路径和域名,服务器对 Cookie的识别靠的就是这两个参数。正常情况下,我们要浏览一个网站时输入的URL便是它的域名,需要经过域名管理系统DNS将其转化为IP地址后进 行连接。若能在DNS上进行一些设置,把目标域名的IP地址对应到其它站点上,我们便可以非法访问目标站点的Cookie了。

    要进行Cookies欺骗,其实很简单。比如在Win9X下的安装目录下,有一名为hosts.sam的文件,以文本方式打开后会看到这样的格式:

    127.0.0.1 localhost

    经过设置,便可以实现域名解析的本地化,只需将IP和域名依上面的格式添加到文件中并另存为 hosts即可。hosts文件实际上可以看成一个本机的DNS系统,它可以负责把域名解释成IP地址,它的优先权比DNS服务器要高,它的具体实现是 TCP/IP协议中的一部分。

    为了提高访问网页的速度,Internet Explorer浏览器会采用累积式加速的方法,将你曾经访问的网页内容(包括图片以及cookie文件等)存放在电脑里。这个存放空间,我们就称它为 IE缓存。以后我们每次访问网站时,IE会首先搜索这个目录,如果其中已经有访问过的内容,那IE就不必从网上下载,而直接从缓存中调出来,从而提高了访 问网站的速度。

    设置IE缓存大小:

    要提高IE的访问速度,IE缓存是必不可少的。IE缓存默认安装在系统区,而且会需要占用较大 的系统空间。所以如果你的系统空间的确很紧张,可以将缓存占用的空间设得小一点,在IE的“工具”菜单下选择“Internet选项”,然后在“常规”选 项卡中你会看到有“Internet临时文件”这一项,单击“设置”按钮,然后在弹出的“设置”对话框中将缓存大小设置为一个合适的值。你也可以直接将 IE缓存移动到其它位置上去。

    “Internet临时文件”下单击“设置”,然后在“设置”对话框中单击“移动文件夹”按钮,在“浏览文件夹”中选择文件夹,将IE缓存移动到其他地方,这样就不必担心IE缓存太大,占用更多空间了。

    Cokies现在经常被大家提到,那么到底什么是Cookies,它有什么作用呢?

    Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬 盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的 网页、停留的时间等信息。当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者 让你不用输入ID、密码就直接登录等等。

    从本质上讲,它可以看作是你的身份证。但Cookies不能作为代码执行,也不会传送病毒,且 为你所专有,并只能由提供它的服务器来读取。保存的信息片断以“名/值”对(name-value pairs)的形式储存,一个“名/值”对仅仅是一条命名的数据。一个网站只能取得它放在你的电脑中的信息,它无法从其它的Cookies文件中取得信 息,也无法得到你的电脑上的其它任何东西。

    Cookies中的内容大多数经过了加密处理,因此一般用户看来只是一些毫无意义的字母数字组合,只有服务器的CGI处理程序才知道它们真正的含义。

    由于Cookies是我们浏览的网站传输到用户计算机硬盘中的文本文件或内存中的数据,因此它 在硬盘中存放的位置与使用的操作系统和浏览器密切相关。在Windows 9X系统计算机中,Cookies文件的存放位置为C:WindowsCookies,在Windows NT/2000/XP的计算机中,Cookies文件的存放位置为C:Documents and Settings用户名Cookies。

    硬盘中的Cookies文件可以被Web浏览器读取,它的命令格式为:用户名@网站地址[数字].txt。如笔者计算机中的一个Cookies文件名为:ch@163[1].txt。要注意的是:硬盘中的Cookies属于文本文件,不是程序。

    Cookies的设置

    你可以在IE的“工具/Internet选项”的“常规”选项卡中,选择“设置/查看文件”, 查看所有保存到你电脑里的Cookies。这些文件通常是以user@domain格式命名的,user是你的本地用户名,domain是所访问的网站的 域名。如果你使用NetsCape浏览器,则存放在 “C:PROGRAMFILESNETS- CAPEUSERS”里面,与IE不同的是,NETSCAPE是使用一个Cookie文件记录所有网站的Cookies。

    我们可对Cookie进行适当设置:打开“工具/Internet选项”中的“隐私”选项卡 (注意该设置只在IE6.0中存在,其他版本IE可以单击“工具/Internet选项”“安全”标签中的“自定义级别”按钮,进行简单调整),调整 Cookie的安全级别。通常情况,可以调整到“中高”或者“高”的位置。多数的论坛站点需要使用Cookie信息,如果你从来不去这些地方,可以将安全 级调到“阻止所有Cookies”;如果只是为了禁止个别网站的Cookie,可以单击“编辑”按钮,将要屏蔽的网站添加到列表中。在“高级”按钮选项 中,你可以对第一方Cookie和第三方的Cookie进行设置,第一方Cookie是你正在浏览的网站的Cookie,第三方Cookie是非正在浏览 的网站发给你的Cookie,通常要对第三方Cookie选择“拒绝”。你如果需要保存Cookie,可以使用IE的“导入导出”功能,打开“文件/导入 导出”,按提示操作即可。

    Cookies的写入与读取

    Cookies集合是附属于Response对象及Request对象的数据集合,使用时需要在前面加上Response或Request。

    用于给客户机发送Cookies的语法通常为:

    当给不存在的Cookies集合设置时,就会在客户机创建,如果该Cookies己存在,则会被代替。由于Cookies是作为HTTP传输的头信息的一部分发给客户机的,所以向客户机发送Cookies的代码一般放在发送给浏览器的HTML文件的标记之前。

    如果用户要读取Cookies,则必须使用Request对象的Cookies集合,其使用方法是:

    需要注意的是,只有在服务器未被下载任何数据给浏览器前,浏览器才能与Server进行 Cookies集合的数据交换,一旦浏览器开始接收 Server所下载的数据,Cookies的数据交换则停止,为了避免错误,要在程序和前面加上response.Buffer=True。

    Cookies的应用

    几乎所有的网站设计者在进行网站设计时都使用了Cookie,因为他们都想给浏览网站的用户提供一个更友好的、人文化的浏览环境,同时也能更加准确地收集访问者的信息。

    网站浏览人数管理

    由于代理服务器、缓存等的使用,唯一能帮助网站精确统计来访人数的方法就是为每个访问者建立一个唯一的ID。使用Cookie,网站可以完成以下工作:测定多少人访问过;测定访问者中有多少是新用户(即第一次来访),多少是老用户;测定一个用户多久访问一次网站。

    通常情况下,网站设计者是借助后台数据库来实现以上目的的。当用户第一次访问该网站时,网站在数据库中建立一个新的ID,并把ID通过Cookie传送给用户。用户再次来访时,网站把该用户ID对应的计数器加1,得到用户的来访次数或判断用户是新用户还是老用户。

    按照用户的喜好定制网页外观

    有的网站设计者,为用户提供了改变网页内容、布局和颜色的权力,允许用户输入自己的信息,然后通过这些信息对网站的一些参数进行修改,以定制网页的外观。

    在电子商务站点中实现诸如“购物篮”等功能

    可以使用Cookie记录用户的ID,这样当你往“购物篮”中放了新东西时,网站就能记录下来,并在网站的数据库里对应着你的ID记录当你“买单”时,网站通过ID检索数据库中你的所有选择就能知道你的“购物篮”里有些什么。

    在一般的事例中,网站的数据库能够保存的有你所选择的内容、你浏览过的网页、你在表单里填写的信息等;而包含有你的唯一ID的Cookie则保存在你的电脑里。

    Cookies的缺陷

    Cookie虽然被广泛的应用,并能做到一些使用其它技术不可能实现的功能。但也存在一些不够完美的方面,给应用带来不便。

    多人共用一台电脑的问题

    任何公共场合的电脑或者许多在办公室或家里使用的电脑,都会同时被两个以上的人使用。这样,当 你用它在网上超市购物时,网上超市或网站会在这台机器上留下一个Cookie,将来也许就会有某个人试图使用你的账户购物,带来了不安全的可能。当然,在 一些使用多用户操作系统如Windows NT或UNIX的电脑上,这并不会成为一个问题。因为在多用户操作系统下不同的账户的Cookie分别放在不同的地方。

    Cookies被删除时

    假如你的浏览器不能正常工作,你可能会删除电脑上所有的临时Internet文件。然而,一旦 这样操作以后,你就会丢掉所有的Cookies文件。当你再次访问一个网站时,网站会认为你是一位新用户并分配给你一个新的用户ID以及一个新的 Cookie。结果将会造成网站统计的新老用户比发生偏差,而你也难以恢复过去保存的参数选择。

    一人使用多台电脑时

    有的人一天之中经常使用一台以上的电脑。例如在办公室里有一台电脑、家里有一台、还有移动办公 用的笔记本电脑。除非网站使用了特别的技术来解决这一问题,否则,你将会有三个不同的Cookies文件在这三台机器上,而在三台机器上访问过的任何网站 都将会把你看成三个不同的用户。

    防范Cookies泄密

    想知道你访问的网站是否在你的硬盘或内存中写入了Cookies信息吗?只需执行下面的操作步骤,就可以了解和控制你正在访问的网站的Cookies信息。

    步骤一 点击IE窗口中的“工具” “In-ernet选项”,打开“Internet选项”设置窗口;

    步骤二 点击“Internet选项”设置窗口中的“安全”标签,然后再点击“自定义级别”按钮,进入“安全设置”窗口;

    步骤三找到“安全设置”窗口中的“Cookies”设置项。“Cookies”设置项下有两个 分选项,其中“允许使用存储在您计算机上的Cookies”是针对存储在用户计算机硬盘中的Cookies文件;“允许使用每个对话Cookies(未存 储)”是针对存储在用户计算机内存中的Cookies信息。存储在硬盘中的Cookies文件是永久存在的,而存储在内存中的Cookies信息是临时 的。要想IE在即将接收来自Web站点的所有Cookies时进行提示,可分别选择上面两个分选项中的“提示”项。当然,你也可以选择“启用”,允许IE 接受所有的Cookies信息(这也是IE的默认选项);选择“禁止”,则是不允许Web站点将Cookies存储到您的计算机上,而且Web站点也不能 读取你计算机中已有的Cookies。

    IE6.0提供了更为可靠的个人隐私及安全保护措施,可以让用户来控制浏览器向外发送信息的多 少。在“Internet 选项”窗口中新增了“隐私”选项卡(图1),用户可以在其中直接设置浏览时的隐私级别,按需要控制其他站点对自己电脑所使用的Cookies。如果我们正 在浏览的站点使用了Cookie,那么在浏览器状态栏中会有一个黄色惊叹号的标记,双击后可打开“隐私报告”对话框,用户可以在其中查看具体的隐私策略, 还可直接点击“设置”按钮后在上述“隐私”选项卡中调节安全隐私级别。

    在“常规”选项卡中还增加了“删除Cookies”按钮(图2),方便用户直接清除本机上的 Cookies。另外,在“工具” “选项” “高级”选项卡中也增加了一些进一步提高安全性的选项(如关闭浏览器时清空Internet临时文件)。其实,如何更好地保护个人隐私和安全是微软下一代 “.NET”战略软件中的关键技术,现在IE6.0已经尝试着迈出了第一步。

    另外,由于Cookies的信息并不都是以文件形式存放在计算机里,还有部分信息保存在内存 里。比如你在浏览网站的时候,Web服务器会自动在内存中生成Cookie,当你关闭IE浏览器的时候又自动把Cookie删除,那样上面介绍的两种方法 就起不了作用,我们需要借助注册表编辑器来修改系统设置。要注意的是,修改注册表前请作备份,以便出现问题后能顺利恢复。

    运行Regedit,找到如下键值: HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionInternet SettingsCacheSpecial PathsCookies,这是Cookies在内存中的键值,把这个键值删除。至此Cookies无论以什么形式存在,我们都不用再害怕了。

    最后有必要说明的一点是:杜绝Cookies虽然可以增强你电脑的信息安全程度,但这样做同样会有一些弊端。比如在一些需要Cookies支持的网页上,会发生一些莫名其妙的错误,典型的例子就是你以后不能使用某些网站的免费信箱了。

    Cookies欺骗

    通过分析Cookie的格式,我们知道,最后两项中分别是它的URL路径和域名,服务器对 Cookie的识别靠的就是这两个参数。正常情况下,我们要浏览一个网站时输入的URL便是它的域名,需要经过域名管理系统DNS将其转化为IP地址后进 行连接。若能在DNS上进行一些设置,把目标域名的IP 地址对应到其它站点上,我们便可以非法访问目标站点的Cookie了。

    要进行Cookies欺骗,其实很简单。比如在Win9X下的安装目录下,有一名为hosts.sam的文件,以文本方式打开后会看到这样的格式:

    127.0.0.1 localhost

    经过设置,便可以实现域名解析的本地化,只需将IP和域名依上面的格式添加到文件中并另存为hosts即可。hosts文件实际上可以看成一个本机的DNS系统,它可以负责把域名解释成IP地址,它的优先权比DNS服务器要高,它的具体实现是TCP/IP协议中的一部分。

    比如我们要读取的目标站点 www.abc.com 所生成的Cookies信息,可以借助www.def.com(自己的站点)。在www.def.com 存放用来进行欺骗所需的文件,通过它读取和修改对方的Cookie。

    步骤一 ping出www.def.com 的IP地址:

    ping www.def.com

    Reply from 192.168.0.1: bytes=32 time=20ms TTL=244

    然后修改hosts.sam文件如下:

    192.168.0.1 www.abc.com

    并保存为hosts文件。

    步骤二 读取Cookies信息:

    将用来读取Cookie的页面传至www.def.com ,此时连上www.abc.com,由于我们进行本机DNS域名解析的修改,这时网络连接的并不是www.abc.com,而是www.def.com 。

    这样www.abc.com设在本地的Cookie便可被读出。

    步骤三 同样道理,你可对读出的数据进行修改,并可将修改后的信息写入Cookie中。修改完毕后,删掉hosts文件,再重新进入www.abc.com,此时所使用的Cookies数据就是你制定的数据。

    总之,在某种程度上虽然可以实现Cookies的欺骗,给网络应用带来不安全的因素,但Cookies文件本身并不会造成用户隐私的泄露,也不会给黑客提供木马程序的载体,只要合理使用,它们会给网站管理员进行网站的维护和管理以及广大用户的使用都带来便利。

    Cookies集合具有以下几种属性

    1.Expires属性:此属性用来给Cookies设置一个期限,在期限内只要打开网页就可以调用被保存的Cookies,如果过了此期限Cookies就自动被删除。如:

    设定Cookies的有效期到2004年4月1日,到时将自动删除。如果一个Cookies没有设定有效期,则其生命周期从打开浏览器开始,到关闭浏览器结束,每次运行后生命周期将结束,下次运行将重新开始。

    2.Domain属性:这个属性定义了Cookies传送数据的唯一性。若只将某Cookies传送给搜狐主页时,则可使用如下代码:

    3.Path属性:定义了Cookies只发给指定的路径请求,如果Path属性没有被设置,则使用应用软件的缺省路径。

    4.Srcure属性:指定Cookies能否被用户读取。

    5.Haskeys属性:如果所请求的Cookies是一个具有多个键值的Cookies字典,则返回True,它是一个只读属性。

    参考资料:http://tech.pcicp.com/tools/nettools/browser/2004/12/21/1103612532d8780.ht

    ASP中的Cookies是什么意思?有谁能详细解释一下。

    最好有例子,不好意思这么菜的问题,22

    Cookies 集合对象

    作用是在浏览器中作标记,是Request ,Response的集合对象

    Cookie的写入只有在信息被输出到浏览器以前才有效

    语法:

    Response.Cookies(“Cookie名称 “)=” Cookie内容”

    Request.Cookies(“Cookie名称”)

    Count

    Request.Cookies.count 浏览器被写入的Cookie数目

    Request.Cookies(n) 等于第n个Cookie的内容

    Expires

    Cookies的失效日期

    Response.Cookies(“Cookie 名称”).Expires=”yyyy/mm/dd”

    从今天算起若干日以内:

    Response.Cookies(“Name”).Expires=FormatDateTime(DataAdd(“d”,N,Data))

    字典

    Response.Cookies(“Dic“)(“xxxx”)=” Cookie内容”(有点像二维数组)

    例:

    Response.Cookies(“Dic“)(“name”)=”jack”

    Response.Cookies(“Dic“)(“ID”)=”0001”

    Request.Cookies(“Dic”).HasKeys 是否含有key ,是不是一部字典

    Request.Cookies(“Dic”).Count key的数目

    专用Cookie

    Response.Cookies(“name”)=”csdn”

    Response.Cookies(“name”).Domain=”www.csdn.net”

    Domain=Request.ServerVariables(“Server_NAME”)

    Response.Cookies(“name”).Domain=Domain

    Response.Cookies(“name”).Path=”/source”

    Response.Cookies(“name”).Path= GetCurrentPath

    cookie分两种:'永久'cookie和session cookie:(打开ie->tools->internet options->security->custom level看看)

    在asp中,当访问一个建立和使用了cookie的页面(语法见楼上)时,这些cookie就 被当作头信息传到当前浏览器窗口中。窗口中页面不断变换,但他们的生命不朽(于是这些网页都可以读取此cookie变量了(当然要有毒取权)。从而解决了 web的无状态问题),只有这个浏览器窗口关闭才会结束。他们被称为session cookie.

    但是,当且仅当页面设置了expires时(见楼上),这些cookie变量便会保存到你的硬 盘上。这就是‘永久’cookie.看看这个例子:你登陆到一个网站,它把你的用户名和密码用COOKIE存放到你自己的硬盘上。你后来关了机回去睡了一 觉。然后再上此网站。它会先读取你的COOKIE,自动登陆上去。你就不用再输入用户名,密码了。(当然了,'永久'COOKIE只有建立它的网站或域才 读的到)

    ‘永久’cookie会一直保存到用EXPIRES指定的日子,然后轻轻地死去。

    建议您访问www.etechbase.net/tech,里面有很多资料,也许可以解决您的问题。

    访问http://168.168.18.11:81/etechbase/advsearch.php将您的问题输入查询内容框,




    http://888hoom.blog.163.com/blog/static/316538622008715102420871/

  • [转]网络诊断工具tcpdump

    2011-10-19 13:53:45


    tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。
       tcpdump提供了代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

    一、概述
    顾名思义,tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
    引用
    # tcpdump -vv
    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
    11:53:21.444591 IP (tos 0x10, ttl  64, id 19324, offset 0, flags [DF], proto 6, length: 92) asptest.localdomain.ssh > 192.168.228.244.1858: P 3962132600:3962132652(52) ack 2726525936 win 1266
    asptest.localdomain.1077 > 192.168.228.153.domain: [bad udp cksum 166e!]  325+ PTR? 244.228.168.192.in-addr.arpa. (46)
    11:53:21.446929 IP (tos 0x0, ttl  64, id 42911, offset 0, flags [DF], proto 17, length: 151) 192.168.228.153.domain > asptest.localdomain.1077:  325 NXDomain q: PTR? 244.228.168.192.in-addr.arpa. 0/1/0 ns: 168.192.in-addr.arpa. (123)
    11:53:21.447408 IP (tos 0x10, ttl  64, id 19328, offset 0, flags [DF], proto 6, length: 172) asptest.localdomain.ssh > 192.168.228.244.1858: P 168:300(132) ack 1 win 1266
    347 packets captured
    1474 packets received by filter
    745 packets dropped by kernel

    不带参数的tcpdump会收集网络中所有的信息包头,数据量巨大,必须过滤。

    二、选项介绍
    引用
    -A 以ASCII格式打印出所有分组,并将链路层的头最小化。

    -c 在收到指定的数量的分组后,tcpdump就会停止。

    -C 在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。

    -d 将匹配信息包的代码以人们能够理解的汇编格式给出。

    -dd 将匹配信息包的代码以c语言程序段的格式给出。

    -ddd 将匹配信息包的代码以十进制的形式给出。

    -D 打印出系统中所有可以用tcpdump截包的网络接口。

    -e 在输出行打印出数据链路层的头部信息。

    -E 用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。

    -f 将外部的Internet地址以数字的形式打印出来。

    -F 从指定的文件中读取表达式,忽略命令行中给出的表达式。

    -i 指定监听的网络接口。

    -l 使标准输出变为缓冲行形式,可以把数据导出到文件。

    -L 列出网络接口的已知数据链路。

    -m 从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。

    -M 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。

    -b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。

    -n 不把网络地址转换成名字。

    -nn 不进行端口名称的转换。

    -N 不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。

    -t 在输出的每一行不打印时间戳。

    -O 不运行分组分组匹配(packet-matching)代码优化程序。

    -P 不将网络接口设置成混杂模式。

    -q 快速输出。只输出较少的协议信息。

    -r 从指定的文件中读取包(这些包一般通过-w选项产生)。

    -S 将tcp的序列号以绝对值形式输出,而不是相对值。

    -s 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。

    -T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。

    -t 不在每一行中输出时间戳。

    -tt 在每一行中输出非格式化的时间戳。

    -ttt 输出本行和前面一行之间的时间差。

    -tttt 在每一行中输出由date处理的默认格式的时间戳。

    -u 输出未解码的NFS句柄。

    -v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。

    -vv 输出详细的报文信息。

    -w 直接将分组写入文件中,而不是不分析并打印出来。


    三、tcpdump的表达式介绍
    表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表 达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包 将会被截获。
    在表达式中一般如下几种类型的关键字:
    引用
    第一种是关于类型的关键字,主要包括 host,net,port,例如 host 210.27.48.2, 指明 210.27.48.2是一台主机,net 202.0.0.0指明202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host。
    第二种是确定传输方向的关键字,主要包括src,dst,dst or src,dst and src, 这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是 210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0。如果没有指明 方向关键字,则缺省是src or dst关键字。
    第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI (分布式光纤数据接口网络)上的特定的网络协议,实际上它是”ether”的别名,fddi和ether 具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump 将会 监听所有协议的信息包。

    除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less, greater,还有三种逻辑运算,取非运算是 ‘not ' '! ‘, 与运算是’and’,’&&';或运算是’or’ ,’||’; 这些关键字可以组合起来构成强大的组合条件来满足人们的需要。

    四、输出结果介绍
    下面我们介绍几种典型的tcpdump命令的输出信息
    (1) 数据链路层头信息
    使用命令:
    #tcpdump --e host ICE

    ICE 是一台装有linux的主机。它的MAC地址是0:90:27:58:AF:1A H219是一台装有Solaris的SUN工作站。它的MAC地址是8:0:20:79:5B:46; 上一条命令的输出结果如下所示:
    引用
    21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ICE.  telne t 0:0(0) ack 22535 win 8760 (DF)

    21:50:12 是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0接收该分组, eth0 >表示从网络接口设备发送分组, 8:0:20:79:5b:46是主机H219的MAC地址, 它表明是从源地址H219发来的分组. 0:90:27:58:af:1a是主机ICE的MAC地址, 表示该分组的目的地址是ICE。 ip 是表明该分组是IP分组,60 是分组的长度, h219.33357 > ICE. telnet 表明该分组是从主机H219的33357端口发往主机ICE的 TELNET(23)端口。 ack 22535 表明对序列号是222535的包进行响应。 win 8760表明发 送窗口的大小是8760。

    (2) ARP包的tcpdump输出信息
    使用命令:
    #tcpdump arp

    得到的输出结果是:
    引用
    22:32:42.802509 eth0 > arp who-has route tell ICE (0:90:27:58:af:1a)
    22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)

    22:32:42 是时间戳, 802509是ID号, eth0 >表明从主机发出该分组,arp表明是ARP请求包, who-has route tell ICE表明是主机ICE请求主机route的MAC地址。 0:90:27:58:af:1a是主机 ICE的MAC地址。

    (3) TCP包的输出信息
    用tcpdump捕获的TCP包的一般输出信息是:
    引用
    src > dst: flags data-seqno ack window urgent options

    src > dst:表明从源地址到目的地址, flags是TCP报文中的标志信息,S 是SYN标志, F (FIN), P (PUSH) , R (RST) "." (没有标记); data-seqno是报文中的数据 的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, urgent表明 报文中是否有紧急指针。 Options是选项。

    (4) UDP包的输出信息
    用tcpdump捕获的UDP包的一般输出信息是:   
    引用
    route.port1 > ICE.port2: udp lenth

    UDP十分简单,上面的输出行表明从主机route的port1端口发出的一个UDP报文 到主机ICE的port2端口,类型是UDP, 包的长度是lenth。

    五、举例
    (1) 想要截获所有210.27.48.1 的主机收到的和发出的所有的分组:
    #tcpdump host 210.27.48.1

    (2) 想要截获主机210.27.48.1 和主机210.27.48.2或210.27.48.3的通信,使用命令(注意:括号前的反斜杠是必须的):
    #tcpdump host 210.27.48.1 and \(210.27.48.2 or 210.27.48.3 \)

    (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    (4) 如果想要获取主机192.168.228.246接收或发出的ssh包,并且不转换主机名使用如下命令:
    #tcpdump -nn -n src host 192.168.228.246 and port 22 and tcp

    (5) 获取主机192.168.228.246接收或发出的ssh包,并把mac地址也一同显示:
    # tcpdump -e src host 192.168.228.246 and port 22 and tcp -n -nn

    (6) 过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头:
    tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24

    (7) 过滤源主机物理地址为XXX的报头:
    tcpdump ether src 00:50:04:BA:9B and dst……

    (为什么ether src后面没有host或者net?物理地址当然不可能有网络喽)。
    (8) 过滤源主机192.168.0.1和目的端口不是telnet的报头,并导入到tes.t.txt文件中:
    Tcpdump src host 192.168.0.1 and dst port not telnet -l > test.txt

    ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。

    六、参考资料
    网络诊断工具tcpdump
    Linux下的网络协议分析工具-tcpdump快速入门手册



    转自:http://hilinux.com/bbs/thread-425-1-1.html


  • lsof 快速起步,查看打开文件

    2011-10-19 09:59:51




    Abstract:
    通过大量的示例介绍使用lsof的方法.

    文档出处:http://io.expert.com.br/~salvatti/tutoriais/seguranca/site/www.aei.ca/pmatilus/pub/lsof-quickstart.txt



    Contents

        查看对某个文件的使用情况
        查看对文件系统的使用
            查找打开,但是不能连接的文件
        无法卸载
        查看监听socket
        查看某个网络连接
        识别 Netstat 连接
        查找针对某个命令打开的文件
        查看某个用户的操作
        更多信息
        Bibliography






    查看对某个文件的使用情况

    查看哪些进程对某个文件进行了调用:

    $ lsof /etc/passwd 1

    查看对文件系统的使用

    /tmp目录被垃圾文件塞满了, 但是, 用ls 又看不到太大文件, 谁干的?

    $ lsof /tmp

    查找打开,但是不能连接的文件

    一个进程打开一个文件, 然后将其设为 unlinked 状态, 则此文件资源仍能被进程使用, 但是其访问路径已经被删除了. 因此, 使用ls不能将其列出. 只有当进程结束时, 才能释放文件占用的资源

    查找unlinked 文件, 选项 +L, 作用: 列出打开文件的连接数

    $lsof +L

    指定连接数的上限 $lsof +L1

    同时指定文件系统, 则需要使用 -a(AND) 选项

    $ lsof -a +L1 /home

    无法卸载

    查看谁令mount的分区无法卸载

    $ lsof <file_system_name>

    查看监听socket
    查看网络服务

    $ lsof -i

    查看某个网络连接

    $ lsof -i@aaa.bbb.ccc

    $ lsof -iTCP@aaa.bbb.ccc:ftp-data *指定协议*

    $ lsof -i4 *指定IP版本*

    $ lsof -i6

    识别 Netstat 连接
    例如: netstat -p -t -n 的输出为:

    Proto Recv-Q Send-Q Local Address Foreign Address State

    tcp 0 0 218.56.203.246:52634 202.109.72.72:7000 ESTABLISHED

    则可以: tony@tony:~$ lsof -iTCP@202.109.72.72:7000

    COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

    xchat 4505 tony 12u IPv4 5775 TCP 218.56.203.246:52634->202.109.72.72:afs3-fileserver (ESTABLISHED)

    查找针对某个命令打开的文件

    使用命令的PID

    $ lsof -p <PID>

    使用命令名称

    $ lsof -c <first_characters_of_command_name_that_interest_you>

    $ lsof -c sendmail

    查看谁在使用设备文件

    $ lsof /dev/hda6
    查看某个用户的操作

    $ id -u tony

    1000

    $ lsof -u1000 or $ lsof -utony

    $ lsof -u^tony * 则是取反的意思*

    更多信息
    更多信息参阅 lsof 的联机手册losf(1).

    Bibliography

    1
        http://io.expert.com.br/~salvatti/tutoriais/seguranca/site/www.aei.ca/pmatilus/pub/lsof-quickstart.txt;

    About this document ...
    lsof 快速起步

    This document was generated using the LaTeX2HTML translator Version 2002-2-1 (1.71)

    Copyright ? 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
    Copyright ? 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

    The command line arguments were:
    latex2html lsof.tex -split 1 -local_icons

    The translation was initiated by tony on 2005-12-18

    转自:http://www.debsir.org/doc/inthedebianway/lsof/lsof.html


  • TCP/UDP Socket调试工具 V2.3_绿色简体中文免费版_支持16进制数据循环发送

    2011-10-08 14:56:45

     

    在测试socket接口前可以使用此工具进行调试,之后手动编写lr脚本就容易的多了,仅供参考。

     

    下载地址:

    http://www.xdowns.com/soft/softdown.asp?softid=34566

    工具:

    TCP_UDP_Socket调试工具 V2.3_绿色简体中文免费版.rar(1.75 MB)

  • Linux命令----top详解

    2011-09-09 15:49:39

    Linux命令----top详解

     
    top命令和ps命令的基本作用是相同的,显示系统当前的进程和其它状况;但是top是 一个动态显示过程,即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。比较准确的说,top命令提供 了实时的对系统处理器的状态监视。它将显示系统中CPU最“敏感”的任务列表。该命令可以按CPU使用。内存使用和执行时间对任务进行排序;而且该命令的 很多特性都可以通过交互式命令或者在个人定制文件中进行设定。在后面的介绍中将把命令参数和交互命令分开讲述。
    #top
    top - 22:19:58 up 24 days,  4:31,  1 user,  load average: 2.08, 1.88, 1.15
    Tasks: 545 total,   7 running, 538 sleeping,   0 stopped,   0 zombie
    Cpu(s): 23.2%us,  6.3%sy,  0.0%ni, 69.7%id,  0.5%wa,  0.2%hi,  0.2%si,  0.0%st
    Mem:   4141608k total,  3992588k used,   149020k free,   249092k buffers
    Swap:  6289352k total,      128k used,  6289224k free,  2604200k cached
      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                               
     2746 mysql     15   0  147m  45m 4752 S   24  1.1   6630:02 mysqld                                                                
    26630 nobody    25   0 25364  10m 3696 S    7  0.3   0:00.20 httpd                                                                 
    24892 nobody    15   0 27012  12m 4044 S    4  0.3   0:00.65 httpd                                                                 
    26619 nobody    15   0 27272  12m 3728 S    3  0.3   0:00.10 httpd                                                                 
    26626 nobody    23   0 25620  10m 3704 S    3  0.3   0:00.09 httpd                                                                 
    26634 nobody    21   0 29716  14m 3576 R    3  0.3   0:00.09 httpd                                                                 
    26628 nobody    25   0 25620  10m 3728 S    3  0.3   0:00.08 httpd                                                                 
    25448 nobody    15   0 26156  11m 4212 S    2  0.3   0:00.40 httpd                                                                 
    23843 nobody    16   0 25900  11m 4116 S    1  0.3   0:00.54 httpd 
     

    统计信息区
    前五行是系统整体的统计信息。第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:

    22:19:58当前时间
    up 24 days,  4:31系统运行时间,格式为时:分
    1 user当前登录用户数
    load average: 2.08, 1.88, 1.15系统负载,即任务队列的平均长度。
    三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

    第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:

    Tasks:545total 进程总数
    7 running 正在运行的进程数
    538sleeping 睡眠的进程数
    0 stopped 停止的进程数
    0 zombie 僵尸进程数
    Cpu(s):23.2%us用户空间占用CPU百分比
    6.3%sy内核空间占用CPU百分比
    0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
    69.7%id空闲CPU百分比
    0.5%wa等待输入输出的CPU时间百分比
    0.2%hi ( Hardware IRQ、IRQ全称为Interrupt Request)硬件中断
    0.2%si  (Software Interrupts)软件中断
    0.0%st 
    (Steal Time)。

    hi  --  Hardware IRQ
              The amount of time the CPU has been servicing hardware interrupts.

    si  --  Software Interrupts
              The amount of time the CPU has been servicing software interrupts.

    st  --  Steal Time
              The amount of CPU 'stolen' from this virtual machine by the hypervi-
              sor for other tasks (such as running another virtual machine).

     

    最后两行为内存信息。内容如下:

    Mem:4141608k total物理内存总量
    3992588k used使用的物理内存总量
    149020k free空闲内存总量
    249092k buffers用作内核缓存的内存量
    Swap:6289352k total交换区总量
    128k used使用的交换区总量
    6289224k free空闲交换区总量
    2604200k cached缓冲的交换区总量。
    内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,
    该数值即为这些内容已存在于内存中的交换区的大小。
    相应的内存再次被换出时可不必再对交换区写入。

    进程信息区
    统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。

    序号 列名 含义
    a PID 进程id
    b PPID 父进程id
    c RUSER Real user name
    d UID 进程所有者的用户id
    e USER 进程所有者的用户名
    f GROUP 进程所有者的组名
    g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
    h PR 优先级
    i NI nice值。负值表示高优先级,正值表示低优先级
    j P 最后使用的CPU,仅在多CPU环境下有意义
    k %CPU 上次更新到现在的CPU时间占用百分比
    lTIME进程使用的CPU时间总计,单位秒
    m TIME+ 进程使用的CPU时间总计,单位1/100秒
    n %MEM 进程使用的物理内存百分比
    o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
    q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    r CODE 可执行代码占用的物理内存大小,单位kb
    s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
    t SHR 共享内存大小,单位kb
    u nFLT 页面错误次数
    v nDRT 最后一次写入到现在,被修改过的页面数。
    w S 进程状态。
    D=不可中断的睡眠状态
    R=运行
    S=睡眠
    T=跟踪/停止
    Z=僵尸进程
    x COMMAND 命令名/命令行
    y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
    z Flags 任务标志,参考 sched.h

    默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。

    更改显示内容
    通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。

    按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。

    按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。

    命令使用

    1. 工具(命令)名称
    top
    2.工具(命令)作用
    显示系统当前的进程和其他状况; top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止. 比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.
    3.环境设置
    在Linux下使用。
    4.使用方法
    4.1使用格式
    top [-] [d] [p] [q] [c] [C] [S] [s] [n]
    4.2参数说明
    d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
    p 通过指定监控进程ID来仅仅监控某个进程的状态。
    q该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
    S 指定累计模式
    s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
    i 使top不显示任何闲置或者僵死进程。
    c 显示整个命令行而不只是显示命令名

    4.3其他--交互命令
      下面介绍在top命令执行过程中可以使用的一些交互命令。从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。
      Ctrl+L 擦除并且重写屏幕。
      h或者? 显示帮助画面,给出一些简短的命令总结说明。
      k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
      i 忽略闲置和僵死进程。这是一个开关式命令。
      q 退出程序。
      r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
      S 切换到累计模式。
      s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
      
       f或者F 从当前显示中添加或者删除项目。(field/Field)

      o或者O 改变显示项目的顺序。(order/Order)

      
     c 切换显示命令名称和完整命令行。
        
       显示设置:上面的简要信息: l , t , m
       l 切换显示平均负载和启动时间信息。
       t 切换显示进程和CPU状态信息。
       m 切换显示内存信息。 
     

        排序:
      M 根据驻留内存大小进行排序。 (M = shift + m)
      P 根据CPU使用百分比大小进行排序。(shift+p)
      T 根据时间/累计时间进行排序。(shift + t)

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

     

     

    用top查看进程

    1、作用
      top命令用来显示执行中的程序进程,使用权限是所有用户。

    2、格式
      top [-] [d delay] [q] [c] [S] [s] [i] [n]

    3、主要参数
      d:指定更新的间隔,以秒计算。
      q:没有任何延迟的更新。如果使用者有超级用户,则top命令将会以最高的优先序执行。
      c:显示进程完整的路径与名称。
      S:累积模式,会将己完成或消失的子行程的CPU时间累积起来。
      s:安全模式。
      i:不显示任何闲置(Idle)或无用(Zombie)的行程。
      n:显示更新的次数,完成后将会退出top。

    第一行表示的项目依次为当前时间、系统运行时间、当前系统登录用户数目、1/5/10分钟系统平均负载(一般来说,这个负载值应该不太可能超过1 才对,除非您的系统很忙碌。如果持续高于5的话,那么.....仔细的看看到底是那个程序在影响整体系统吧!)。

      第二行显示的是所有启动的进程、目前运行、挂起 (Sleeping)的和无用(Zombie)的进程。

      第三行显示的是目前CPU的使用情况,包括us用户空间占用CPU百分比、sy 内核空间占用CPU百分比、ni 用户进程空间内改变过优先级的进程占用CPU百分比(中断处理占用)、id 空闲CPU百分比、wa 等待输入输出的CPU时间百分比、hi( Hardware IRQ、IRQ全称为Interrupt Request)硬件中断、si(Software Interrupts)硬件中断、st(Steal Time)。

      第四行显示物理内存的使用情况,包括总的可以使用的内存、已用内存、空闲内存、缓冲区占用的内存。

      第五行显示交换分区使用情况,包括总的交换分区、使用的、空闲的和用于高速缓存的大小。

      第六行显示的项目最多,下面列出了详细解释。

      PID(Process ID):进程标示号 ( 每个 process 的 ID )

      USER:进程所有者的用户名 ( 该 process 所属的使用者 )

      PR:进程的优先级别 ( Priority 的简写,程序的优先执行顺序,越小越早被执行 )

      NI:进程的优先级别数值 ( Nice 的简写,与 Priority 有关,也是越小越早被执行 )

      VIRT:进程占用的虚拟内存值。

      RES:进程占用的物理内存值。

      SHR:进程使用的共享内存值。

      S:进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。

      %CPU:该进程占用的CPU使用率。

      %MEM:该进程占用的物理内存和总内存的百分比。

      TIME+:该进程启动后占用的总的CPU时间 ( CPU 使用时间的累加 )

      Command:进程启动的启动命令名称,如果这一行显示不下,进程会有一个完整的命令行。

    4、top命令使用过程中,还可以使用一些交互的命令来完成其它参数的功能。这些命令是通过快捷键启动的。

      <空格>:立刻刷新。

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

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

      q:退出top命令。

      m:切换显示内存信息。

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

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

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

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

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

     

    转自:

    http://space.itpub.net/8554499/viewspace-580475

    http://www.howsky.net/index.php/archives/1569

  • 数据统计

    • 访问量: 709364
    • 日志数: 415
    • 图片数: 1
    • 文件数: 3
    • 建立时间: 2008-12-07
    • 更新时间: 2015-07-14

    RSS订阅

    Open Toolbar