4.0内核性能优化 linux
2018-04-04 19:16:47 limHappipen 阅读数 833

1 Linux设备驱动概述及开发环境构建

1.1 设备驱动的作用

  • 驱使硬件设备行动

1.2 无操作系统时的设备驱动

  • 典型架构:一个无限循环中夹杂着对设备中断的检测或者对设备的轮询
    无标题.png

1.3 有操作系统时的设备驱动

  • 并发 、内存管理

    无标题.png

1.4 Linux 设备驱动

1.4.1 设备的分类及特点

● 字符设备。
● 块设备。
● 网络设备。

1.4.2 Linux 设备驱动与整个软硬件系统的关系

捕获.PNG

1.4.3 Linux 设备驱动的重点、难点

● 编写 Linux 设备驱动要求工程师有非常好的硬件基础,懂得 SRAM、 Flash、 SDRAM、磁盘的读写方式,UART、 I2C、 USB 等设备的接口以及轮询、中断、 DMA 的原理,PCI 总线的工作方式以及 CPU 的内存管理单元(MMU)等。
● 编写 Linux 设备驱动要求工程师有非常好的 C 语言基础,能灵活地运用 C 语言的结构体、指针、函数指针及内存动态申请和释放等。
● 编写 Linux 设备驱动要求工程师有一定的 Linux 内核基础,虽然并不要求工程师对内核各个部分有深入的研究,但至少要明白驱动与内核的接口。尤其是对于块设备、网络设备、 Flash 设备、串口设备等复杂设备,内核定义的驱动体系结构本身就非常复杂。
● 编写 Linux 设备驱动要求工程师有非常好的多任务并发控制和同步的基础,因为在驱动中会大量使用自旋锁、互斥、信号量、等待队列等并发与同步机制。

2 驱动设计的硬件基础

2.1 处理器

2.1.1 通用处理器

2.1.2 数字信号处理器

捕获.PNG

2.2 存储器

捕获.PNG

捕获.PNG

2.3 接口与总线

串口 、I2C 、SPI 、USB、以太网 、PCI 和 PCI-E 、SD 和 SDIO

捕获.PNG

捕获.PNG

2.4 CPLD 和 FPGA

2.5 原理图分析

  • 符号 、网络 、描述

2.6 硬件时序分析

  • 时序分析的意思是让芯片之间的访问满足芯片数据手册中时序图信号有效的先后顺序、采样建立时间(Setup Time)和保持时间(Hold Time)的要求

2.7 芯片数据手册阅读方法

2.8 仪器仪表使用

  • 万用表 、示波器 、逻辑分析仪

3 Linux 内核及内核编程

3.1 Linux 内核的发展与演变

  • 表 3.1 Linux 操作系统版本的历史及特点
版 本 时 间 特 点
Linux 0.1 1991 年 10 月 最初的原型
Linux 1.0 1994 年 3 月 包含了 386 的官方支持,仅支持单 CPU 系统
Linux 1.2 1995 年 3 月 第一个包含多平台(Alpha、 Sparc、 MIPS 等)支持的官方版本
Linux 2.0 1996 年 6 月 包含很多新的平台支持,最重要的是,它是第一个支持 SMP(对称多处理器)体系的内核版本
Linux 2.2 1999 年 1 月 极大提升 SMP 系统上 Linux 的性能,并支持更多的硬件
Linux 2.4 2001 年 1 月 进一步提升了 SMP 系统的扩展性,同时也集成了很多用于支持桌面系统的特性: USB、 PC 卡(PCMCIA)的支持,内置的即插即用等
Linux 2.6.0 ~ 2.6.39 2003 年 12 月~2011 年 5 月 无论是对于企业服务器还是对于嵌入式系统, Linux 2.6 都是一个巨大的进步。对高端机器来说,新特性针对的是性能改进、可扩展性、吞吐率,以及对 SMP 机器 NUMA 的支持。对于嵌入式领域,添加了新的体系结构和处理器类型。包括对那些没有硬件控制的内存管理方案的无MMU 系统的支持。同样,为了满足桌面用户群的需要,添加了一整套新的音频和多媒体驱动程序
Linux 3.0 ~ 3.19、Linux 4.0-rc1 至今 2011 年 7 月至今 性能优化等 开发热点聚焦于虚拟化、新文件系统、 Android、新体系结构支持以及

3.2 内核组件

捕获.PNG

1. 进程调度

捕获.PNG

2. 内存管理

捕获.PNG

3. 虚拟文件系统

捕获.PNG

4. 网络接口

捕获.PNG

5. 进程间通信

  • 进程间通信支持进程之间的通信, Linux 支持进程间的多种通信机制,包含信号量、共享内存、消息队列、管道、 UNIX 域套接字等,这些机制可协助多个进程、多资源的互斥访问、进程间的同步和消息传递。在实际的 Linux 应用中,人们更多地趋向于使用 UNIX 域套接字,而不是 System V IPC 中的消息队列等机制。 Android 内核则新增了 Binder 进程间通信方式。

4 内核模块

4.1 模块简介

insmod ./hello.ko
rmmod hello

lsmod
/proc/modules
/sys/module

4.2 模块结构

4.2.1 加载函数

static int __init hello_init(void)
{
    ...

    return 0;
}

module_init(hello_init);

4.2.2 卸载函数

static void __exit hello_exit(void)
{
    ...
}

module_exit(hello_exit);

4.2.3 许可声明

MODULE_AUTHOR("lin");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("A simple param Module");
MODULE_ALIAS("a simplest module");
  • 模块参数module_param(var, int, S_IRUGO);
  • 导出符号EXPORT_SYMBOL_GPL(func); (proc/kallsyms)

5 文件系统与设备文件

捕获.PNG

捕获.PNG

6 字符设备驱动

6.1 驱动结构

6.1.1 cdev结构体

捕获.PNG

//生成dev
MKDEV(int major, int minor);    //major:0-19 minor:20-31
//获取设备号
MAJOR(dev_t dev)
MINOR(dev_t dev)
//cdev操作
void cdev_init(struct cdev *, struct file_operations *);
struct cdev* cdev_alloc(void);
void cdev_put(struct cdev *);
int  cdev_add(struct cdev *, dev_t, unsigned);
void cdev_del(struct cdev *);

6.1.2 设备号分配

int register_chrdev_region(dev_t from, unsigned count, const char *name);
int    alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);

int unregister_chrdev_region(dev_t from, unsigned count);

6.1.3 file_operations结构体

捕获.PNG

7 设备驱动中的并发控制

7.1 并发与竞态

  • 临界区:访问共享资源的代码段
  • 互斥:中断屏蔽、原子操作、自旋锁、信号量、互斥体

7.2 编译乱序和执行乱序

  • 表 隔离指令
指令名 功能描述
DMB 数据存储器隔离。DMB 指令保证: 仅当所有在它前面的存储器访问操作都执行完毕后,才提交(commit)在它后面的存储器访问操作。
DSB 数据同步隔离。比 DMB 严格: 仅当所有在它前面的存储器访问操作都执行完毕后,才执行在它后面的指令(亦即任何指令都要等待存储器访 问操作——译者注)
ISB 指令同步隔离。最严格:它会清洗流水线,以保证所有它前面的指令都执行完毕之后,才执行它后面的指令。

7.3 中断屏蔽

local_irq_disable() local_irq_enable() //与自旋锁联合使用
local_irq_save(flags) local_irq_restore(flags)
local_bh_disable() local_bh_enable()

7.4 原子操作

7.4.1 整型原子操作

  • 设置

    void atomic_set(atomic_t *v, int i);
    atomic_t ATOMIC_INIT(int i);
  • 获取

    int atomic_read(atomic_t *v);
  • 加减

    void atomic_add(int i, atomic_t *v);
    void atomic_sub(int i, atomic_t *v);
    
    void atomic_inc(atomic_t *v);
    void atomic_dec(atomic_t *v);
  • 操作后测试(为0返回true,非0返回false)

    int atomic_inc_and_test(atomic_t *v);
    int atomic_dec_and_test(atomic_t *v);
    int atomic_sub_and_test(int i, atomic_t *v);
  • 操作后返回新值

    int atomic_add_return(int i, atomic_t *v);
    int atomic_sub_return(int i, atomic_t *v);
    
    int atomic_inc_return(atomic_t *v);
    int atomic_dec_return(atomic_t *v);

7.4.2 位原子操作

捕获.PNG

7.5 自旋锁

7.5.1 自旋锁

spinlock_t lock;
spin_lock_init(lock);
spin_lock(lock);
spin_trylock(lock);
spin_unlock(lock);


spin_lock_irq(lock); spin_unlock_irq(lock);
spin_lock__irqsave(lock); spin_unlock_irqrestore(lock);
spin_lock_bh(lock); spin_unlock_bh(lock);

无标题.png

7.5.2 读写锁

无标题.png

7.5.3 顺序锁

  • 读执行单元不会被写执行单元阻塞;但写执行单元进行写操作时,其他写执行单元就会自旋。

无标题.png

7.5.4 读-复制-更新

  • RCU: Read-Copy-Update

    捕获.PNG

    无标题.png

    7.6 信号量

    无标题.png

    7.7 互斥体

    无标题.png

    7.8 完成量

    无标题.png

8 阻塞I/O和非阻塞I/O

8.1 阻塞I/O和非阻塞I/O

fd= open("/dev/ttyS1", O_RDWR | O_NONBLOCK);
fcntl(fd, F_SETFL, O_NONBLOCK);

8.1.1 等待队列

//定义
wait_queue_head_t queue_head;
//初始化
init_waitqueue_head(&queue_head);
//定义及初始化
DECLARE_WAIT_QUEUE_HEAD(name)
//队列等待元素
DECLARE_WAITQUEUE(name, tsk)
//操作
void add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
void remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
//等待事件
wait_event(queue, condition)
wait_event_interruptible(queue, condition)
wait_event_timeout(queue, condition, timeout)
wait_event_interruptible_timeout(queue, condition, timeout)
//唤醒队列
void wake_up(wait_queue_head_t *q);
void wake_up_interruptible(wait_queue_head_t *q);
//睡眠
sleep_on(wait_queue_head_t *q);
interruptible_sleep_on(wait_queue_head_t *q);
static ssize_t xxx_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
{
    ...
    DECLARE_WAITQUEUE(wait, current);
    add_wait_queue(&xxx_wait, &wait);

    /*等待设备缓冲区可写*/
    do {
        avail = device_writable();
        if (avail < 0) {
            if (file->f_flags & O_NONBLOCK) {
                ret = -EAGAIN;
                goto out;
            }
            __set_current_state(TASK_INTERRUPTIBLE);
            schedule();
            if (signal_pending(current)) {
                ret = -ERESTARTSYS;
                goto out;
            }
        }
    } while (avail < 0);

    device_write();
out:
    remove_wait_queue(&xxx_wait, &wait);
    set_current_state(TASK_RUNNING);

    reutrn ret;
}

捕获.PNG

8.1.2 支持等待队列的globalfifo

无标题.png

8.2 轮询操作

8.2.1 轮询的概念与作用

9.2.3 信号的释放

  1. 异步通知结构体

    struct xxx_dev{
        struct cdev cdev;
        ...
        struct fasync_struct *async_queue;
    }
    1. xxx_fasync
    static int xxx_fasync(int fd, struct file *filp, int mode)
    {
        struct xxx_dev *dev=file->private_data;
        return fasync_helper(fd, filp, mode, &dev->async_queue);
    }
    1. 释放读信号
    //xxx_write
    if(dev->async_queue)
      kill_fasync(&dev->async_queue, SIGIO, POLL_IN);
    1. 从异步通知列表删除filp
    //xxx_release
    xxx_fasync(-1, filp, 0);

9.4 Linux异步I/O

9.4.1 AIO

struct aiocb {
 
  int aio_fildes;               // File Descriptor
  int aio_lio_opcode;           // Valid only for lio_listio (r/w/nop)
  volatile void *aio_buf;       // Data Buffer
  size_t aio_nbytes;            // Number of Bytes in Data Buffer
  struct sigevent aio_sigevent; // Notification Structure
 
  /* Internal fields */
  ...
 
};
API 函数 说明
aio_read int aio_read( struct aiocb *aiocbp ); 请求异步读操作
aio_error int aio_error( struct aiocb *aiocbp ); 检查异步请求的状态
aio_return ssize_t aio_return( struct aiocb *aiocbp ); 获得完成的异步请求的返回状态
aio_write int aio_write( struct aiocb *aiocbp ); 请求异步写操作
aio_suspend int aio_suspend( const struct aiocb *const cblist[], int n, const struct timespec *timeout ); 挂起调用进程,直到一个或多个异步请求已经完成(或失败)
aio_cancel int aio_cancel( int fd, struct aiocb *aiocbp ); 取消异步 I/O 请求
lio_listio int lio_listio( int mode, struct aiocb *list[], int nent, struct sigevent *sig ); 发起一系列 I/O 操作

9.4.2 内核AIO与libaio

10 中断与时钟

10.1 中断与定时器

11 内存与I/O访问

17 I2C、SPI、USB驱动架构类比

无标题.png

18 ARM Linux设备树

18.1 ARM设备树起源

  • 可描述的信息:
    • CPU的数量和类别
    • 内存基地址和大小
    • 总线和桥
    • 外设连接
    • 中断控制器和中断使用情况
    • GPIO控制器和GPIO使用情况
    • 时钟控制器和时钟使用情况

18.2 设备树的组成和结构

18.2.1 DTS、DTC和DTB

  1. .dts:device tree source

    1.1 Soc共用部分:.dtsi (/include/ “s3c24440.dtsi”)

    1.2 模板

    /* root节点 */
    / {
        node1 {
            a-string-property = "A string";
            a-string-list-property = "first string", "second string";
            a-byte-data-property = [0x01 0x23 0x34 0x56];
            child-node1 {
                first-child-property;
                second-child-property = <1>;
                a-string-property = "Hello, world";
            };
            child-node2 {
            };
        };
        node2 {
            an-empty-property;
            a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
            child-node1 {
            };
        };
    };
  2. .dtc:device tree compiler

  3. .dtb:Device Tree Blob

2018-10-22 22:40:50 qq_36337149 阅读数 366

第二章 Linux 的内核结构及构建

  • ---->这一章是自己总结的

1、内核结构(主要是下面这几个部分)

  • 系统调用接口<–>System call interface
  • 进程管理<------>Process management
  • 内存管理<------>Memory management
  • 虚拟文件系统<–>VFS
  • 网络设备<------>Net
  • 进程间通信<---->IPC
  • 设备驱动<------>Drivers
    • -------->具体对应的目录见书上59页

2、Makefiles and build system of kernel–kbuild

2.1 makefile包含五大部分

  • The top Makefile:内核源码根目录下的Makefile,所有内核代码编译的入口。它负责两类东西的编译:

    • vmlinux:内核映像,Image->zImage -> boot.img,img是内核的常住居民。随系统启动而运行,直到系统关机。
    • modules:内核模块 xxx.ko,这种形式,也是内核源码的一种二进制形式,从本质上来说和内核映像是一样。但是ko是以普通文件的形式存在的,不随系统启动而运行,在系统需要你的时候 insmod xxx.ko,不需要你的时候就rmmod xxx.ko.如: camera.ko,ko形式多见于外设驱动它递归进入到内核源码树子目录去构建这些目标,应该至少包含一个arch的makefile和一个arch/$(ARCH)/Makefile(跟具体硬件平台相关)
  • .config:内核源码根目录下,内核编译的配置文件,该文件直接决定哪些文件编译、怎么编译,内核配置文件包含像下面这些选项:

    • CONFIG_EXPERIMENTAL=y
    • CONFIG_BROKEN_ON_SMP=y
    • CONFIG_INIT_ENV_ARG_LIMIT=32
    • CONFIG_CROSS_COMPILE=“arm-linux-”
  • arch/$(ARCH)/Makefile:体系结构相关的Makefile,决定底层CPU相关的源码如何编译。为top Makefile提供具体硬件体系结构相关的信息。

  • scripts/Makefile.*:包含了一些通用的Makefile模式,函数,脚本等等。供其他Makefile包含

  • kbuild Makefiles_:每个子目录有一个kubild makefile,决定哪些文件编译到vmlinux(built-in),哪些编成在ko,kbuild(内核编译系统)内置了几个变量

    • obj-y: 这个变量指定的.o文件列表,最终编译到vmlinux中去
      obj-y := a.o b.o c.o
      a-y = 1.o 2.o

      • 1.o <- 1.c,2.o < 2.c
        ->a.o
      • b.o <- b.c,c.o <- c.c
        => vmlinux -> … -> boot.img
    • obj-m:obj-m这个变量指定的.o文件列表,kbuild最终会为每个.o生成一个同名的ko文件

      • obj-m := a.o b.o,a.o -> a.ko,b.o -> b.ko
    • 语法:目标名-y/目标名-objs:生成"目标名"所依赖的.o文件列表

      • obj-m := a.o b.o

        • a.c(a.s) ->a.o -> a.ko
        • b.c(b.s) ->b.o -> b.ko
      • obj-m := sb.o nb.o

      • sb-y := a.o b.o c.o

        • a.o <- a.c(a.s)
        • b.o <- b.c(b.s)
        • c.o <- c.c(c.s)
          • =>sb.o -> sb.ko
          • nb.c(nb.s) -> nb.o -> nb.ko
      • obj-$(CONFIG_XXX) += sb.o

        • kbuild只认  obj-y obj-m

        • sb.o编还是不编,得看变量CONFIG_XXX的值

        • if CONFIG_XXX = y sb.o编,而且编进vmlinux

        • if CONFIG_XXX = m sb.o编成sb.ko

        • else other , 不编

           obj-m += camera.o
           camera-objs += a.o b.o
           camera-$(CONFIG_MEIYANG) += mei.o  
          
      • obj-$(CONFIG_XXX) += xxx/

        • 表示你如果选择了CONFIG_XXX请到子目录xxx下面去读Makefile

2.2 内核编译的两大步骤

  • 1、配置
    • make menuconfig:=> 生成一个人性化的配置菜单树(供你选择)
      • sudo apt-get install libncurses5-dev
      • 目的是生成一个 .config (配置文件,决定哪些文件编译,哪些不编译)
        • CONFIG_FOO = y
        • CONFIG_MM = m
        • CONFIG_XX = n
  • 2、编译 make(sudo ./mk -k)
    • a. 先读.config里面的内容,把相应的变量值替换到Makefile中去
      • obj-$(CONFIG_FOO) += foo.o
      • obj-$(CONFIG_MM) += mm.o
      • obj-$(CONFIG_XX) += xx.o
      • ----->
        • obj-y += foo.o
        • obj-m += mm.o
        • obj-n += xx.o
    • b. 编译
      • foo.o -> foo.o -> vmlinux
      • mm.c -> mm.o -> mm.ko
  • 3、一个例子
    • 先准备好下面的文件:my_char_drivers/hello.c,Kconfig,Makefile
    • (1) 把my_char_drivers整个目录拷贝到  内核源码目录的 drivers/char
    • (2) 修改 drivers/char/Kconfig 增加一行,让其包含my_char_drivers/Kconfig
      • vim dirvers/char/Kconfig 增加一行
      • source “drivers/char/my_char_drivers/Kconfig”
    • (3) 修改 drivers/char/Makefile 增加一行,让其包含my_char_drivers/Makefile
      • vim drivers/char/Makefile 增加-行
      • obj-$(CONFIG_zhoulong_drivers) += my_char_drivers/

2.3 .config的内容

  • Kconfig
    • Kconfig是作为.config的配置文件
    • 内容是用kconfig特有的语言编写
    • 配置信息的数据库是一个配置选项的集合
  • Kconfig 语法
    • config
      • config <symbol>
      • <config options>
        • 关键字config开始一个新的配置入口,紧接着的一行是上一个选项的属性,举例:

           config FOO
               tristate
               prompt "a test"
               depends on BAR
               default m
               help
               "a example for config entry"
          
    • menuconfig
      • menuconfig <symbol>
      • <config options>
    • menu/endmenu
      • menu “some prompt info”
      • <menu options>
      • <menu block>
      • endmenu
    • if/endif
      • if <expr>
      • endif
    • source
      • source “xxx/xxx/Kconfig”
    • choice/endchoice
      • choice [symbol]
      • <choice options>
      • <choice block>
      • endchoice
        • 一个选择只能是一个布尔值或三态,布尔选项只允许单个配置选项被选中,但是三态选择还允许将任意数量的配置项设置为“m”。
        • 这个可以用在如果一个硬件有多个驱动程序存在并且只有一个驱动程序可以编译进内核,但是所有的驱动程序可以编译成模块
    • comment
      • comment “some prompt info”
      • <comment options>
        • 这定义了一个注释,它在配置过程中显示给用户,并且也与输出到输出文件。唯一可能的选项是依赖项。

3、An example

4、Process of making zImage(uImage)

第三章 Linux内核及内核编程

3.2 linux 2.6以后内核的特点(相对于linux2.4)

1.新的调度器

  • 内核 2.6 的早期采用了 O(1) 算法,之后转移到 CFS(Completely Fair Scheduler,完全公平调度)算法。在 Linux
    3.14 中,也增加了一个新的调度类:SCHED_DEADLINE,它实现了 EDF(Earliest Deadline First,最早截止期限优先)调度算法。

2.内核抢占

  • Linux 2.6 以后的内核版本还是存在一些不可抢占的区间,如中断上下文、软中断上下文和自旋锁锁住的区间
    在这里插入图片描述
    可以看到,在 Linux 2.4 的内核中,在 IRQ1 的中断服务程序唤醒 RT(实时)任务后,必须要等待前面一个 Normal(普通)任务的系统调用完成,返回用户空间的时候,RT 任务才能切入;而在 Linux 2.6 内核中,Normal 任务的关键部分(如自旋锁)结束的时候,RT 任务就从内核切入了。

3.改进的线程模型

  • Linux 2.6 以后版本中的线程采用 NPTL(Native POSIX Thread Library,本地 POSIX 线程库)模型,操作速度得以极大提高,内核本身也增加了 FUTEX(Fast Userspace Mutex,快速用户态互斥体),从而减小多线程的通信开销。

4.虚拟内存的变化

  • 从虚拟内存的角度来看,新内核融合了 r-map(反向映射)技术,显著改善虚拟内存在一定大小负载下的性能。反向映射即可以通过页结构体快速寻找到页面的映射。

5.文件系统

  • Linux 2.6 版内核增加了对日志文件系统功能的支持,还包括对扩展属性及 POSIX 标准访问控制的支持。ext2/ext3/ext4 作为大多数 Linux 系统默认安装的文件系统,在 Linux 2.6 版内核中增加了对扩展属性的支持,可以给指定的文件在文件系统中嵌入元数据。
  • 在文件系统方面,当前的研究热点是基于 B 树的 Btrfs,Btrfs 称为是下一代 Linux 文件系统,它在扩展性、数据一致性、多设备管理和针对 SSD 的优化等方面都优于 ext4

6.音频

  • 高级 Linux 音频体系结构(Advanced Linux Sound Architecture,ALSA),ALSA 支持 USB 音频和 MIDI 设备,并支持全双工重放等功能

7.总线、设备和驱动模型

  • 总线是三者联系起来的基础,通过一种总线类型,将设备和驱动联系起来。总线类型中的 match() 函数用来匹配设备和驱动,当匹配操作完成之后就会执行驱动程序中的probe() 函数。

8.电源管理

9.联网和 IPSec

  • 改进了对 IPv6 的支持

10. 用户界面层

11. Linux 3.0 后 ARM 架构的变更

  • ARM Linux 的代码在时钟、DMA、pinmux、计时器刻度等诸多方面都进行了优化和调整,也删除了arch/arm/mach-xxx/include/mach 头文件目录,以至于 Linux 3.7 以后的内核可以支持多平台,即用同一份内核镜像运行于多家 SoC 公司的多个芯片,实现“一个Linux 可适用于所有的 ARM 系统”。

3.3 Linux 内核的组成

3.3.1 Linux 内核源代码的目录结构

目录 功能
arch 包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如 i386、arm、arm64、powerpc、mips 等。存放的是各个平台以及各个平台的芯片对 Linux 内核进程调度、内存管理、中断等的支持,以及每个具体的 SoC 和电路板的板级支持代码。
block 块设备驱动程序 I/O 调度
crypto 常用加密和散列算法(如 AES、SHA 等),还有一些压缩和 CRC 校验算法
documentation 内核各部分的通用解释和注释
drivers 设备驱动程序,每个不同的驱动占用一个子目录,如 char、block、net、mtd、i2c 等。
fs 所支持的各种文件系统,如 EXT、FAT、NTFS、JFFS2 等
include 头文件,与系统相关的头文件放置在 include/linux 子目录下
init 内核最核心的部分,包括进程调度、定时器等,而和平台相关的一部分代码放在 arch/*/kernel 目录下
lib 库文件代码
mm 内存管理代码,和平台相关的一部分代码放在 arch/*/mm 目录下
net 网络相关代码,实现各种常见的网络协议
scripts 用于配置内核的脚本文件
security 主要是一个 SELinux 的模块
sound ALSA、OSS 音频设备的驱动核心代码和常用设备驱动
usr 实现用于打包和压缩的 cpio 等
include 内核 API 级别头文件

3.3.2 Linux 内核的组成部分

  • 进程调度
    • 在 Linux 内核中,使用 task_struct 结构体来描述进程,该结构体中包含描述该进程内存资源、文件系统资源、文件资源、tty 资源、信号处理等的指针。Linux 的线程采用轻量级进程模型来实现,在用户空间通过 pthread_create() API 创建线程的时候,本质上内核只是创建了一个新的 task_struct,并将新task_struct 的所有资源指针都指向创建它的那个 task_struct
      的资源指针。
  • 内存管理
    • 一般而言,32 位处理器的 Linux 的每个进程享有 4GB 的内存空间,0 ~ 3GB 属于用户空间,3 ~ 4GB 属于内核空间,内核空间对常规内存、I/O 设备内存以及高端内存有不同的处理方式。上次CVTE笔试考了下面这个图(画出来)
      在这里插入图片描述
    1. 虚拟文件系统
    • Linux 虚拟文件系统隐藏了各种硬件的具体细节,为所有设备提供了统一的接口。而且,它独立于各个具体的文件系统,是对各种文件系统的一个抽象。它为上层的应用程序提供了统一的 vfs_read()、vfs_write() 等接口,并调用具体底层文件系统或者设备驱动中实现的 file_operations 结构体的成员函数。
  • 4.网络接口(略)
  • 5.进程间通信(略)

3.3.3 Linux 内核空间与用户空间

  • ARM 处理器分为 7 种工作模式:

3.4 Linux 内核的编译及加载

3.4.1 Linux 内核的编译

  • Linux 驱动开发者需要牢固地掌握 Linux 内核的编译方法以为嵌入式系统构建可运行的Linux 操作系统映像。
    • 运行 make menuconfig 等时,配置工具首先分析与体系结构对应的 /arch/xxx/Kconfig 文件(xxx 即为传入的 ARCH 参数),/arch/xxx/Kconfig 文件中除本身包含一些与体系结构相关的配置项和配置菜单以外,还通过 source 语句引入了一系列 Kconfig 文件,而这些 Kconfig又可能再次通过 source 引入下一层的 Kconfig,配置工具依据 Kconfig 包含的菜单和条目即可描绘出一个如图 3.9 所示的分层结构。

3.4.2 Kconfig 和 Makefile

  • 在 Linux 内核中增加程序需要完成以下 3 项工作
    • 将编写的源代码复制到 Linux 内核源代码的相应目录中
    • 在目录的 Kconfig 文件中增加关于新源代码对应项目的编译配置选项
    • 在目录的 Makefile 文件中增加对新源代码的编译条目

3.4.3 Linux 内核的引导(ARM Linux 为例)

  • 。一般的 SoC 内嵌入了 bootrom,上电时 bootrom 运行。对于 CPU0 而言,bootrom 会去引导 bootloader,而其他 CPU 则判断自己是不是 CPU0,进入 WFI 的状态等待 CPU0 来唤醒它。CPU0 引导 bootloader,bootloader 引导Linux 内核,在内核启动阶段,CPU0 会发中断唤醒 CPU1,之后 CPU0 和 CPU1 都投入运行。CPU0 导致用户空间的 init 程序被调用,init 程序再派生其他进程,派生出来的进程再派生其他进程。CPU0 和 CPU1 共担这些负载,进行负载均衡。

3.5 Linux 下的 C 编程特点

3.5.1 Linux 编码风格

  • 在内核源代码下存在一个文件 Documentation/CodingStyle,进行了比较详细的描述

  • 在 Windows 程序中,习惯以如下方式命名宏、变量和函数

      #def ine PI 3.1415926  /* 用大写字母代表宏 */
      int minValue, maxValue; /* 变量:第一个单词全小写,其后单词的第一个字母大写 */
      void SendData(void);  /* 函数:所有单词第一个字母都大写 */
    
  • 在 Linux 中它会被命名为:

      #def ine PI 3.1415926
      int min_value, max_value;
      void send_data(void);
    

3.6 工具链

  • 见书本page100-page101

第4章 Linux内核模块

4.9 模块的编译

  • 例:
KVERS = $(shell uname -r)

#Kernel module
obj-m += hello.o

#Specify flags for the module compilation
#EXTRA_CFLAGS = -g -O0

build:kernel_modules
kernel_modules:
    make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
clean:
    make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean

。。。未完

。。。。。。。

。。。。。。。

2015-08-13 09:59:37 zhonglinzhang 阅读数 456

一。Linux内核主要有几种内核锁

       主要有自旋锁和信号量

       自旋锁是防止多处理器并发而引入的一种锁,在内核中大量应用于中断处理


二。Linux用户模式和内核模式

       用户模式是受限模式,对内存和硬件的访问必须通过系统调用实现

       内核模式是一种高特权模式,能直接访问内存和硬件


三。怎样申请大块内核内存

        vmalloc()用于申请内核大块内存,特点是线性地址连续,物理地址不连续,不能直接用于DMA

        kmalloc()申请小块内存,基于slab实现的,最多32 * PAGE_SIZE - 16字节的内存,16字节被业描述符结构占用,特点线性地址连续,物理地址 连续,可以用于DMA


四。用户进程间通信主要几种方式

       1. 管道: 具有亲缘关系金城见的通信

       2. 命名管道: 克服了管道没有名字的限制,还允许无亲缘关系进程间的通信

       3. 信号: 用于通知接受进程有某种事件发生

       4. 消息队列: 消息队列克服了信号承载信息量少,管道只能无格式字节流以及缓冲区大小受限等

       5. 共享内存: 

       6. 信号量: 进程间以及同一进程不同线程间

       7. 套接字


五。伙伴系统算法

       1. 


2016-01-21 10:21:20 aiqixiao1015 阅读数 172

一、前言

1) Linux Proc文件系统,通过对Proc文件系统进行调整,达到性能优化的目的。
2) Linux性能诊断工具,介绍如何使用Linux自带的诊断工具进行性能诊断。
加粗斜体表示可以直接运行的命令。
下划线表示文件的内容。
二、/proc/sys/kernel/优化
1) /proc/sys/kernel/ctrl-alt-del
该文件有一个二进制值,该值控制系统在接收到ctrl+alt+delete按键组合时如何反应。这两个值分别是:
零(0)值,表示捕获ctrl+alt+delete,并将其送至 init 程序;这将允许系统可以安全地关闭和重启,就好象输入shutdown命令一样。
壹(1)值,表示不捕获ctrl+alt+delete,将执行非正常的关闭,就好象直接关闭电源一样。

缺省设置:0
建议设置:1,防止意外按下ctrl+alt+delete导致系统非正常重启。
2) proc/sys/kernel/msgmax
该文件指定了从一个进程发送到另一个进程的消息的最大长度(bytes)。进程间的消息传递是在内核的内存中进行的,不会交换到磁盘上,所以如果增加该值,则将增加操作系统所使用的内存数量。

缺省设置:8192
3) /proc/sys/kernel/msgmnb
该文件指定一个消息队列的最大长度(bytes)。

缺省设置:16384
4) /proc/sys/kernel/msgmni
该文件指定消息队列标识的最大数目,即系统范围内最大多少个消息队列。

缺省设置:16
5) /proc/sys/kernel/panic
该文件表示如果发生“内核严重错误(kernel panic)”,则内核在重新引导之前等待的时间(以秒为单位)。
零(0)秒,表示在发生内核严重错误时将禁止自动重新引导。

缺省设置:0
6) proc/sys/kernel/shmall
该文件表示在任何给定时刻,系统上可以使用的共享内存的总量(bytes)。

缺省设置:2097152
7) /proc/sys/kernel/shmmax
该文件表示内核所允许的最大共享内存段的大小(bytes)。

缺省设置:33554432
建议设置:物理内存 * 50%

实际可用最大共享内存段大小=shmmax * 98%,其中大约2%用于共享内存结构。
可以通过设置shmmax,然后执行ipcs -l来验证。
8) /proc/sys/kernel/shmmni
该文件表示用于整个系统的共享内存段的最大数目(个)。

缺省设置:4096
9) /proc/sys/kernel/threads-max
该文件表示内核所能使用的线程的最大数目。

缺省设置:2048
10) /proc/sys/kernel/sem
该文件用于控制内核信号量,信号量是System VIPC用于进程间通讯的方法。

建议设置:250 32000 100 128
第一列,表示每个信号集中的最大信号量数目。
第二列,表示系统范围内的最大信号量总数目。
第三列,表示每个信号发生时的最大系统操作数目。
第四列,表示系统范围内的最大信号集总数目。
所以,(第一列)*(第四列)=(第二列)

以上设置,可以通过执行ipcs -l来验证。
11) 待续。。。
三、/proc/sys/vm/优化
1) /proc/sys/vm/block_dump
该文件表示是否打开Block Debug模式,用于记录所有的读写及Dirty Block写回动作。

缺省设置:0,禁用Block Debug模式
2) /proc/sys/vm/dirty_background_ratio
该文件表示脏数据到达系统整体内存的百分比,此时触发pdflush进程把脏数据写回磁盘。

缺省设置:10
3) /proc/sys/vm/dirty_expire_centisecs
该文件表示如果脏数据在内存中驻留时间超过该值,pdflush进程在下一次将把这些数据写回磁盘。

缺省设置:3000(1/100秒)
4) /proc/sys/vm/dirty_ratio
该文件表示如果进程产生的脏数据到达系统整体内存的百分比,此时进程自行把脏数据写回磁盘。

缺省设置:40
5) /proc/sys/vm/dirty_writeback_centisecs
该文件表示pdflush进程周期性间隔多久把脏数据写回磁盘。

缺省设置:500(1/100秒)
6) /proc/sys/vm/vfs_cache_pressure
该 文件表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode cache;增加该值超过100,将导致内核倾向于回收directory和inode cache。

缺省设置:100
7) /proc/sys/vm/min_free_kbytes
该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。

缺省设置:724(512M物理内存)
8) /proc/sys/vm/nr_pdflush_threads
该文件表示当前正在运行的pdflush进程数量,在I/O负载高的情况下,内核会自动增加更多的pdflush进程。

缺省设置:2(只读)
9) /proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存(参照overcommit_ratio)。

缺省设置:0
10) /proc/sys/vm/overcommit_ratio
该文件表示,如果overcommit_memory=2,可以过载内存的百分比,通过以下公式来计算系统整体可用内存。
系统可分配内存=交换空间+物理内存*overcommit_ratio/100

缺省设置:50(%)
11) /proc/sys/vm/page-cluster
该文件表示在写一次到swap区的时候写入的页面数量,0表示1页,1表示2页,2表示4页。

缺省设置:3(2的3次方,8页)
12) /proc/sys/vm/swapiness
该文件表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换。

缺省设置:60
13) legacy_va_layout
该文件表示是否使用最新的32位共享内存mmap()系统调用,Linux支持的共享内存分配方式包括mmap(),Posix,System VIPC。
0, 使用最新32位mmap()系统调用。
1, 使用2.4内核提供的系统调用。

缺省设置:0
14) nr_hugepages
该文件表示系统保留的hugetlb页数。
15) hugetlb_shm_group
该文件表示允许使用hugetlb页创建System VIPC共享内存段的系统组ID。
16) 待续。。。
四、/proc/sys/fs/优化
1) /proc/sys/fs/file-max
该文件指定了可以分配的文件句柄的最大数目。如果用户得到的错误消息声明由于打开
文件数已经达到了最大值,从而他们不能打开更多文件,则可能需要增加该值。

缺省设置:4096
建议设置:65536
2) /proc/sys/fs/file-nr
该文件与 file-max 相关,它有三个值:
已分配文件句柄的数目
已使用文件句柄的数目
文件句柄的最大数目
该文件是只读的,仅用于显示信息。
3) 待续。。。
五、/proc/sys/net/core/优化
该目录下的配置文件主要用来控制内核和网络层之间的交互行为。
1) /proc/sys/net/core/message_burst
写新的警告消息所需的时间(以 1/10 秒为单位);在这个时间内系统接收到的其它警告消息会被丢弃。这用于防止某些企图用消息“淹没”系统的人所使用的拒绝服务(Denial of Service)攻击。

缺省设置:50(5秒)
2) /proc/sys/net/core/message_cost
该文件表示写每个警告消息相关的成本值。该值越大,越有可能忽略警告消息。

缺省设置:5
3) /proc/sys/net/core/netdev_max_backlog
该文件表示在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

缺省设置:300
4) /proc/sys/net/core/optmem_max
该文件表示每个套接字所允许的最大缓冲区的大小。

缺省设置:10240
5) /proc/sys/net/core/rmem_default
该文件指定了接收套接字缓冲区大小的缺省值(以字节为单位)。

缺省设置:110592
6) /proc/sys/net/core/rmem_max
该文件指定了接收套接字缓冲区大小的最大值(以字节为单位)。

缺省设置:131071
7) /proc/sys/net/core/wmem_default
该文件指定了发送套接字缓冲区大小的缺省值(以字节为单位)。

缺省设置:110592
8) /proc/sys/net/core/wmem_max
该文件指定了发送套接字缓冲区大小的最大值(以字节为单位)。

缺省设置:131071
9) 待续。。。
六、/proc/sys/net/ipv4/优化
1) /proc/sys/net/ipv4/ip_forward
该文件表示是否打开IP转发。
0,禁止
1,转发

缺省设置:0
2) /proc/sys/net/ipv4/ip_default_ttl
该文件表示一个数据报的生存周期(Time To Live),即最多经过多少路由器

缺省设置:64
增加该值会降低系统性能。
3) /proc/sys/net/ipv4/ip_no_pmtu_disc
该文件表示在全局范围内关闭路径MTU探测功能。

缺省设置:0
4) /proc/sys/net/ipv4/route/min_pmtu
该文件表示最小路径MTU的大小。

缺省设置:552
5) /proc/sys/net/ipv4/route/mtu_expires
该文件表示PMTU信息缓存多长时间(秒)。

缺省设置:600(秒)
6) /proc/sys/net/ipv4/route/min_adv_mss
该文件表示最小的MSS(Maximum Segment Size)大小,取决于第一跳的路由器MTU。

缺省设置:256(bytes)
6.1 IP Fragmentation
1) /proc/sys/net/ipv4/ipfrag_low_thresh/proc/sys/net/ipv4/ipfrag_low_thresh
两个文件分别表示用于重组IP分段的内存分配最低值和最高值,一旦达到最高内存分配值,其它分段将被丢弃,直到达到最低内存分配值。

缺省设置:196608(ipfrag_low_thresh)
262144(ipfrag_high_thresh)
2) /proc/sys/net/ipv4/ipfrag_time
该文件表示一个IP分段在内存中保留多少秒。

缺省设置:30(秒)
6.2 INET Peer Storage
1) /proc/sys/net/ipv4/inet_peer_threshold
INET对端存储器某个合适值,当超过该阀值条目将被丢弃。该阀值同样决定生存
时间以及废物收集通过的时间间隔。条目越多,存活期越低,GC 间隔越短。

缺省设置:65664
2) /proc/sys/net/ipv4/inet_peer_minttl
条目的最低存活期。在重组端必须要有足够的碎片(fragment)存活期。这个最低
存活期必须保证缓冲池容积是否少于 inet_peer_threshold。该值以 jiffies为
单位测量。

缺省设置:120
3) /proc/sys/net/ipv4/inet_peer_maxttl
条目的最大存活期。在此期限到达之后,如果缓冲池没有耗尽压力的话(例如:缓
冲池中的条目数目非常少),不使用的条目将会超时。该值以 jiffies为单位测量。

缺省设置:600
4) /proc/sys/net/ipv4/inet_peer_gc_mintime
废物收集(GC)通过的最短间隔。这个间隔会影响到缓冲池中内存的高压力。 该值
以 jiffies为单位测量。

缺省设置:10
5) /proc/sys/net/ipv4/inet_peer_gc_maxtime
废物收集(GC)通过的最大间隔,这个间隔会影响到缓冲池中内存的低压力。 该值
以 jiffies为单位测量。

缺省设置:120
6.3 TCP Variables
1) /proc/sys/net/ipv4/tcp_syn_retries
该文件表示本机向外发起TCP SYN连接超时重传的次数,不应该高于255;该值仅仅针对外出的连接,对于进来的连接由tcp_retries1控制。

缺省设置:5
2) /proc/sys/net/ipv4/tcp_keepalive_probes
该文件表示丢弃TCP连接前,进行最大TCP保持连接侦测的次数。保持连接仅在
SO_KEEPALIVE套接字选项被打开时才被发送。

缺省设置:9(次)
3) /proc/sys/net/ipv4/tcp_keepalive_time
该文件表示从不再传送数据到向连接上发送保持连接信号之间所需的秒数。

缺省设置:7200(2小时)
4) /proc/sys/net/ipv4/tcp_keepalive_intvl
该文件表示发送TCP探测的频率,乘以tcp_keepalive_probes表示断开没有相应的TCP连接的时间。

缺省设置:75(秒)
5) /proc/sys/net/ipv4/tcp_retries1
该文件表示放弃回应一个TCP连接请求前进行重传的次数。

缺省设置:3
6) /proc/sys/net/ipv4/tcp_retries2
该文件表示放弃在已经建立通讯状态下的一个TCP数据包前进行重传的次数。

缺省设置:15
7) /proc/sys/net/ipv4/tcp_orphan_retries
在近端丢弃TCP连接之前,要进行多少次重试。默认值是 7 个,相当于 50秒–
16分钟,视 RTO 而定。如果您的系统是负载很大的web服务器,那么也许需
要降低该值,这类 sockets 可能会耗费大量的资源。另外参考
tcp_max_orphans。
8) /proc/sys/net/ipv4/tcp_fin_timeout
对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能
会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。过去在
2.2版本的内核中是 180 秒。您可以设置该值,但需要注意,如果您的机器为负
载很重的web服务器,您可能要冒内存被大量无效数据报填满的风险,
FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1,因为它们最多只吃 1.5K
的内存,但是它们存在时间更长。另外参考 tcp_max_orphans。

缺省设置:60(秒)
9) /proc/sys/net/ipv4/tcp_max_tw_buckets
系统在同时所处理的最大timewait sockets 数目。如果超过此数的话,
time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制,纯
粹为了抵御那些简单的 DoS 攻击,千万不要人为的降低这个限制,不过,如果
网络条件需要比默认值更多,则可以提高它(或许还要增加内存)。

缺省设置:180000
10) /proc/sys/net/ipv4/tcp_tw_recyle
打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求,请不要随
意修改这个值。

缺省设置:0
11) /proc/sys/net/ipv4/tcp_tw_reuse
该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接。

缺省设置:0
12) /proc/sys/net/ipv4/tcp_max_orphans
系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量,那
么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这
个限制,纯粹为了抵御那些简单的 DoS 攻击,千万不要依赖这个或是人为的降
低这个限制。

缺省设置:8192
13) /proc/sys/net/ipv4/tcp_abort_on_overflow
当守护进程太忙而不能接受新的连接,就向对方发送reset消息,默认值是false。
这意味着当溢出的原因是因为一个偶然的猝发,那么连接将恢复状态。只有在你确
信守护进程真的不能完成连接请求时才打开该选项,该选项会影响客户的使用。

缺省设置:0
14) /proc/sys/net/ipv4/tcp_syncookies
该文件表示是否打开TCP同步标签(syncookie),内核必须打开了 CONFIG_SYN_COOKIES项进行编译。 同步标签(syncookie)可以防止一个套接字在有过多试图连接到达时引起过载。

缺省设置:0
15) /proc/sys/net/ipv4/tcp_stdurg
使用 TCP urg pointer 字段中的主机请求解释功能。大部份的主机都使用老旧的
BSD解释,因此如果您在 Linux 打开它,或会导致不能和它们正确沟通。

缺省设置:0
16) /proc/sys/net/ipv4/tcp_max_syn_backlog
对于那些依然还未获得客户端确认的连接请求,需要保存在队列中最大数目。对于
超过 128Mb 内存的系统,默认值是 1024,低于 128Mb 的则为 128。如果
服务器经常出现过载,可以尝试增加这个数字。警告!假如您将此值设为大于
1024,最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE,以保持
TCP_SYNQ_HSIZE*16 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如
果tcp_adv_win_scale 128Mb 32768-610000)则系统将忽略所有发送给自己
的ICMP ECHO请求或那些广播地址的请求。

缺省设置:1024
17) /proc/sys/net/ipv4/tcp_window_scaling
该 文件表示设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到 65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力。

缺省设置:1
18) /proc/sys/net/ipv4/tcp_sack
该文件表示是否启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。

缺省设置:1
19) /proc/sys/net/ipv4/tcp_timestamps
该文件表示是否启用以一种比超时重发更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。

缺省设置:1
20) /proc/sys/net/ipv4/tcp_fack
该文件表示是否打开FACK拥塞避免和快速重传功能。

缺省设置:1
21) /proc/sys/net/ipv4/tcp_dsack
该文件表示是否允许TCP发送“两个完全相同”的SACK。

缺省设置:1
22) /proc/sys/net/ipv4/tcp_ecn
该文件表示是否打开TCP的直接拥塞通告功能。

缺省设置:0
23) /proc/sys/net/ipv4/tcp_reordering
该文件表示TCP流中重排序的数据报最大数量。

缺省设置:3
24) /proc/sys/net/ipv4/tcp_retrans_collapse
该文件表示对于某些有bug的打印机是否提供针对其bug的兼容性。

缺省设置:1
25) /proc/sys/net/ipv4/tcp_wmem
该文件包含3个整数值,分别是:min,default,max
Min:为TCP socket预留用于发送缓冲的内存最小值。每个TCP socket都可以使用它。
Default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem中default的 值,一般要低于net.core.wmem中default的值。
Max:为TCP socket预留用于发送缓冲的内存最大值。该值不会影响net.core.wmem_max,今天选择参数SO_SNDBUF则不受该值影响。默认值为128K。

缺省设置:4096 16384 131072
26) /proc/sys/net/ipv4/tcp_rmem
该文件包含3个整数值,分别是:min,default,max
Min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下TCP socket都至少会有这么多数量的内存用于接收缓冲。
Default: 为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem中default的值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win的 默认值情况下,TCP 窗口大小为65535。
Max:为TCP socket预留用于接收缓冲的内存最大值。该值不会影响 net.core.wmem中max的值,今天选择参数 SO_SNDBUF则不受该值影响。

缺省设置:4096 87380 174760
27) /proc/sys/net/ipv4/tcp_mem
该文件包含3个整数值,分别是:low,pressure,high
Low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。
Pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。
High:允许所有tcp sockets用于排队缓冲数据报的页面量。
一般情况下这些值是在系统启动时根据系统内存数量计算得到的。

缺省设置:24576 32768 49152
28) /proc/sys/net/ipv4/tcp_app_win
该文件表示保留max(window/2^tcp_app_win, mss)数量的窗口由于应用缓冲。当为0时表示不需要缓冲。

缺省设置:31
29) /proc/sys/net/ipv4/tcp_adv_win_scale
该 文件表示计算缓冲开销bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale >; 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0)。

缺省设置:2
6.4 IP Variables
1) /proc/sys/net/ipv4/ip_local_port_range
该文件表示TCP/UDP协议打开的本地端口号。

缺省设置:1024 4999
建议设置:32768 61000
2) /proc/sys/net/ipv4/ip_nonlocal_bind
该文件表示是否允许进程邦定到非本地地址。

缺省设置:0
3) /proc/sys/net/ipv4/ip_dynaddr
该 参数通常用于使用拨号连接的情况,可以使系统动能够立即改变ip包的源地址为该ip地址,同时中断原有的tcp对话而用新地址重新发出一个syn请求包, 开始新的tcp对话。在使用ip欺骗时,该参数可以立即改变伪装地址为新的ip地址。该文件表示是否允许动态地址,如果该值非0,表示允许;如果该值大于 1,内核将通过log记录动态地址重写信息。

缺省设置:0
4) /proc/sys/net/ipv4/icmp_echo_ignore_all/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
该文件表示内核是否忽略所有的ICMP ECHO请求,或忽略广播和多播请求。
0, 响应请求
1, 忽略请求

缺省设置:0
建议设置:1
5) /proc/sys/net/ipv4/icmp_ratelimit
6) /proc/sys/net/ipv4/icmp_ratemask
7) /proc/sys/net/ipv4/icmp_ignore_bogus_error_reponses
某些路由器违背RFC1122标准,其对广播帧发送伪造的响应来应答。这种违背行
为通常会被以告警的方式记录在系统日志中。如果该选项设置为True,内核不会
记录这种警告信息。

缺省设置:0
8) /proc/sys/net/ipv4/igmp_max_memberships
该文件表示多播组中的最大成员数量。

缺省设置:20
6.5 Other Configuration
1) /proc/sys/net/ipv4/conf/*/accept_redirects
如果主机所在的网段中有两个路由器,你将其中一个设置成了缺省网关,但是该网关
在收到你的ip包时发现该ip包必须经过另外一个路由器,这时这个路由器就会给你
发一个所谓的“重定向”icmp包,告诉将ip包转发到另外一个路由器。参数值为布尔
值,1表示接收这类重定向icmp 信息,0表示忽略。在充当路由器的linux主机上缺
省值为0,在一般的linux主机上缺省值为1。建议将其改为0以消除安全性隐患。
2) /proc/sys/net/ipv4/*/accept_source_route
是否接受含有源路由信息的ip包。参数值为布尔值,1表示接受,0表示不接受。在
充当网关的linux主机上缺省值为1,在一般的linux主机上缺省值为0。从安全性角
度出发,建议关闭该功能。
3) /proc/sys/net/ipv4/*/secure_redirects
其实所谓的“安全重定向”就是只接受来自网关的“重定向”icmp包。该参数就是
用来设置“安全重定向”功能的。参数值为布尔值,1表示启用,0表示禁止,缺省值
为启用。
4) /proc/sys/net/ipv4/*/proxy_arp
设置是否对网络上的arp包进行中继。参数值为布尔值,1表示中继,0表示忽略,
缺省值为0。该参数通常只对充当路由器的linux主机有用。
七、性能优化策略
7.1 基本优化
1) 关闭后台守护进程
系统安装完后,系统会默认启动一些后台守护进程,有些进程并不是必需的;因此,关闭这些进程可以节省一部分物理内存消耗。以root身份登录系统,运行ntsysv,选中如下进程:
iptables
network
syslog
random
apmd
xinetd
vsftpd
crond
local
修改完后,重新启动系统。
如此,系统将仅仅启动选中的这些守护进程。
2) 减少终端连接数
系统默认启动6个终端,而实际上只需启动3个即可;以root身份登录系统,运行vi /etc/inittab,修改成如下:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
如上所述,注释掉4、5、6终端。
3) 待续。。。
7.2 网络优化
1) 优化系统套接字缓冲区
net.core.rmem_max=16777216
net.core.wmem_max=16777216
2) 优化TCP接收/发送缓冲区
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
3) 优化网络设备接收队列
net.core.netdev_max_backlog=3000
4) 关闭路由相关功能
net.ipv4.conf.lo.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.eth0.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0

net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0

net.ipv4.conf.lo.secure_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.eth0.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0

net.ipv4.conf.lo.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.eth0.send_redirects=0
net.ipv4.conf.default.send_redirects=0
5) 优化TCP协议栈
打开TCP SYN cookie选项,有助于保护服务器免受SyncFlood攻击。
net.ipv4.tcp_syncookies=1

打开TIME-WAIT套接字重用功能,对于存在大量连接的Web服务器非常有效。
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_tw_reuse=1

减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。
net.ipv4.tcp_fin_timeout=30

减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接。
net.ipv4.tcp_keepalive_time=1800

增加TCP SYN队列长度,使系统可以处理更多的并发连接。
net.ipv4.tcp_max_syn_backlog=8192

作者“ERDP技术架构”


2017-11-12 19:58:00 weixin_34321753 阅读数 5

转一位大神的笔记。

linux的性能优化:
1、CPU,MEM
2、DISK--RAID
3、网络相关的外设,网卡

linux系统性能分析:
top:linux系统的负载,CPU,MEM,SWAP,占用CPU和内存比较的进程,杀死占用性能高的进程。
[root@asianux4 ~]# top
top - 22:45:24 up 22:53,  5 users,  load average: 0.00, 0.00, 0.00
当前的时间,开机时间为22小时53分钟,5个用户在线,linux系统的负载(CPU核数*1),最近1分钟,最近5分钟,最近15分钟。

Tasks: 151 total,   1 running, 150 sleeping,   0 stopped,   0 zombie
系统已打开的进程总数为151个,1个正在运行,150休眠,0个停止,0个阻塞。

Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
按1(123的1)显示CPU的所有核。
id,wa: 
id=100%,wa=0% 表示系统负载非常低。
id=0%,wa=100% 表示系统我载非常高。 
id=100%,wa=100% 表示CPU压力低,磁盘、网络可能压力高,可能死锁。
id=0%,wa=0%   表示CPU压力大,有进程在占用CPU做运算。

Mem:   1914488k total,   468192k used,  1446296k free,    73692k buffers
Swap:   835576k total,        0k used,   835576k free,   240788k cached
物理内存为2G,规划内存为468M左右,剩余内存为1.44G,共享缓存为73M,高速缓存240M。
虚拟内存为835M,没有使用,剩余835M。
使用内存:高速缓存+共享缓存=320M

[root@asianux4 ~]# cat /proc/meminfo
MemTotal:        1914488 kB
MemFree:         1446568 kB
Buffers:           73940 kB    共享缓存
Cached:           240792 kB    高速缓存
SwapCached:            0 kB
Active:           142040 kB    活动缓存
Inactive:         196632 kB    非活动缓存
Active(anon):      24120 kB
Inactive(anon):      128 kB
Active(file):     117920 kB
Inactive(file):   196504 kB
Unevictable:           0 kB

L(小写) 显示或关闭linux系统负载行
t     显示或关闭进程和CPU行。
m      显示或关闭内存行。
1     显示或关闭多核CPU显示。
z     显示或关闭颜色
b     显示或关闭高负载的进程。
k     杀死进程
r     调整进程的优先级,默认优先级为0, 20~-19  -19优先级最高。
h     查看帮助。

sar 显示CPU的性能,磁盘,页面,IO的信息。

[root@asianux4 ~]# sar 1 10
[root@asianux4 ~]# sar 1 10
Linux 2.6.32-431.20.3.el6.x86_64 (asianux4)     2015年09月18日  _x86_64_        (4 CPU)

23时14分13秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
23时14分14秒     all      0.00      0.00      0.25      0.00      0.00     99.75
23时14分15秒     all      0.00      0.00      0.00      0.00      0.00    100.00
23时14分16秒     all      0.00      0.00      0.25      0.00      0.00     99.75
23时14分17秒     all      0.00      0.00      0.00      0.00      0.00    100.00
23时14分18秒     all      0.00      0.00      0.25      0.00      0.00     99.75
23时14分19秒     all      0.00      0.00      0.00      0.00      0.00    100.00
23时14分20秒     all      0.00      0.00      0.00      0.00      0.00    100.00
23时14分21秒     all      0.00      0.00      0.25      0.00      0.00     99.75
23时14分22秒     all      0.00      0.00      0.00      0.00      0.00    100.00
23时14分23秒     all      0.00      0.00      0.00      0.00      0.00    100.00
平均时间:     all      0.00      0.00      0.10      0.00      0.00     99.90

23时20分35秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
23时20分36秒     all      0.00      0.00     11.95      0.00      0.00     88.05
23时20分38秒     all      0.00      0.00     32.70      3.77      0.00     63.52
23时20分39秒     all      0.00      0.00     23.08     38.06      0.00     38.87
23时20分40秒     all      0.00      0.00      7.02     26.32      0.00     66.67
23时20分41秒     all      0.00      0.00     10.81     40.54      0.00     48.65
23时20分42秒     all      0.00      0.00     20.49     42.62      0.00     36.89

[root@asianux4 ~]# sar -d 1 每秒扫描一次。
23时23分07秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
23时23分08秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
23时23分08秒   dev8-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
23时23分08秒    dev8-0    256.45  65651.61      0.00    256.00      2.60     10.16      6.18    158.39
23时23分08秒   dev8-32    143.55     12.90 102812.90    716.31      3.53     24.60     10.57    151.77
23时23分08秒   dev8-64    109.68      0.00 101161.29    922.35      3.07     25.90     14.74    161.61
23时23分08秒   dev8-80      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
23时23分08秒   dev8-48    108.06      0.00 101161.29    936.12      2.86     24.33     13.60    146.94
23时23分08秒  dev253-0    254.84  65238.71      0.00    256.00      2.59     10.18      6.21    158.23
23时23分08秒  dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
23时23分08秒    dev9-0  24879.03     12.90 199019.35      8.00      0.00      0.00      0.00      0.00
23时23分08秒  dev253-2  24879.03     12.90 199019.35      8.00    829.52     28.60      0.07    175.00
23时23分08秒  dev253-3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

vmstat 显示虚拟内存的状况。

[root@asianux4 ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0  77268  21360 1652176    0    0     4     6    4    5  0  0 100  0  0
 1  0      0  77260  21360 1652192    0    0     0     0   20   19  0  0 100  0  0
 0  0      0  77244  21368 1652200    0    0     0    72   43   48  0  0 100  0  0
 0  0      0  77244  21368 1652204    0    0     0     0   15   17  0  0 100  0  0
 0  0      0  77244  21368 1652208    0    0     0     0   14   21  0  0 100  0  0
 0  0      0  77244  21368 1652208    0    0     0     0   16   19  0  0 100  0  0
 0  0      0  77244  21368 1652208    0    0     0     0   14   23  0  0 100  0  0
 0  0      0  77244  21368 1652208    0    0     0     0   16   20  0  0 100  0  0

iostat 显示磁盘IO状况。
[root@asianux4 ~]# iostat 1
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00   28.04   10.14    0.00   61.82

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.00         0.00         0.00          0          0
sdb               0.00         0.00         0.00          0          0
sda               3.96         0.00        55.45          0         56
sdc             121.78       182.18     51169.31        184      51681
sde             122.77       150.50     49347.52        152      49841
sdf               0.00         0.00         0.00          0          0
sdd             116.83       332.67     51232.67        336      51745
dm-0              6.93         0.00        55.45          0         56
dm-1              0.00         0.00         0.00          0          0
md0           12800.99        15.84    102392.08         16     103416
dm-2              0.00         0.00         0.00          0          0
dm-3          12801.98        15.84    102400.00         16     103424

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00   13.83   16.60    0.00   69.57

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.00         0.00         0.00          0          0
sdb               0.00         0.00         0.00          0          0
sda               0.00         0.00         0.00          0          0
sdc              78.00        24.00     40680.00         24      40680
sde              80.00        40.00     41680.00         40      41680
sdf               0.00         0.00         0.00          0          0
sdd              79.00       328.00     40680.00        328      40680
dm-0              0.00         0.00         0.00          0          0
dm-1              0.00         0.00         0.00          0          0
md0           10136.00         0.00     81088.00          0      81088
dm-2              0.00         0.00         0.00          0          0
dm-3          10136.00         0.00     81088.00          0      81088


ps    显示进程
[root@asianux4 ~]# ps -ef    显示所有进程
[root@asianux4 ~]# ps -aux    显示系统中所有进程的详细信息。

pstree     显示进程树
[root@asianux4 ~]# pstree
init┬─NetworkManager
     ├─abrtd
     ├─acpid
     ├─atd
     ├─auditd───{auditd}
     ├─automount───4*[{automount}]
     ├─certmonger
     ├─console-kit-dae───63*[{console-kit-da}]
     ├─crond
     ├─cupsd
     ├─dbus-daemon
     ├─hald─┬─hald-runner─┬─hald-addon-acpi
     │        │               └─hald-addon-inpu
     │        └─{hald}
     ├─httpd───8*[httpd]
     ├─irqbalance
     ├─4*[login───bash]
     ├─master─┬─pickup
     │            └─qmgr
     ├─mcelog
     ├─2*[mingetty]
     ├─modem-manager
     ├─rpc.statd
     ├─rpcbind
     ├─rsyslogd───4*[{rsyslogd}]
     ├─sshd───bash───pstree
     ├─sshd
     ├─udevd───2*[udevd]
     ├─vsftpd
     └─wpa_supplicant
[root@asianux4 ~]#


显示系统运行的时间。
[root@asianux4 ~]# uptime
 23:43:23 up 23:51,  5 users,  load average: 0.03, 0.09, 0.10
[root@asianux4 ~]# cat /proc/uptime
85901.05 341926.67
[root@asianux4 ~]#

显示内存的情况:
[root@asianux4 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          1869       1800         68          0         21       1636
-/+ buffers/cache:        142       1727
Swap:          815          0        815

真正的使用内存:142+21=163M    1800-1636-1=163M

显示多核CPU的状况:mpstat

[root@asianux4 ~]# mpstat -P ALL 1
23时49分44秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle

23时49分45秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
23时49分45秒    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
23时49分45秒    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
23时49分45秒    2    0.00    0.00    0.97    0.00    0.00    0.00    0.00    0.00   99.03
23时49分45秒    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

第一列:时间
第二列:CPU及CPU的核数
第三列:用户占用CPU的百分比
第四列:优先级调整时占用CPU的百分比
第五列:系统
第六列:iowait IO等待
第七列:硬中断
第八列:软中断
第九列:虚拟CPU中虚拟指令占用CPU的百分比(虚拟环境中使用)
第十列:虚机占用CPU的百分比
第十一列:CPU的空闲百分比

显示进程的动态链接库文件及占用内存的大小。

[root@asianux4 ~]# pmap -x 7652
7652:   /usr/sbin/sshd
Address           Kbytes     RSS   Dirty Mode   Mapping
00007f8ad1bf1000      48       0       0 r-x--  libnss_files-2.12.so
00007f8ad1bfd000    2048       0       0 -----  libnss_files-2.12.so
00007f8ad1dfd000       4       4       4 r----  libnss_files-2.12.so
00007f8ad1dfe000       4       4       4 rw---  libnss_files-2.12.so
00007f8ad1dff000      28       0       0 r-x--  librt-2.12.so
00007f8ad1e06000    2044       0       0 -----  librt-2.12.so
00007f8ad2005000       4       4       4 r----  librt-2.12.so
00007f8ad2006000       4       4       4 rw---  librt-2.12.so
00007f8ad2007000     228       0       0 r-x--  libnspr4.so
00007f8ad2040000    2048       0       0 -----  libnspr4.so
00007f8ad2240000       4       4       4 r----  libnspr4.so
00007f8ad2241000       8       8       8 rw---  libnspr4.so

查看系统中进程的动态内存。
[root@asianux4 ~]# cat while.sh
#!/bin/bash
while true
do
pmap -d 7652|tail -1
sleep 2
done
[root@asianux4 ~]# chmod +x while.sh
[root@asianux4 ~]# sh while.sh
mapped: 66616K    writeable/private: 808K    shared: 0K
mapped: 66616K    writeable/private: 808K    shared: 0K
mapped: 66616K    writeable/private: 808K    shared: 0K


进程的调试:strace
[root@asianux4 ~]# strace -c -p 6610
Process 6610 attached - interrupt to quit
Process 6610 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  -nan    0.000000           0        39           select
  -nan    0.000000           0        39           wait4
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                    78           total

显示当前系统所有进程的动态链接库。
[root@asianux4 ~]# lsof |grep vsftpd
vsftpd    3788      root  cwd       DIR              253,0     4096          2 /
vsftpd    3788      root  rtd       DIR              253,0     4096          2 /
vsftpd    3788      root  txt       REG              253,0   159568     176841 /usr/sbin/vsftpd
vsftpd    3788      root  mem       REG              253,0   124624     176040 /lib64/libselinux.so.1
vsftpd    3788      root  mem       REG              253,0   472064     163188 /lib64/libfreebl3.so
...后面已省略

找到动态链接库文件后,再到rpmfind.net或关盘网址查阅/lib64/libpthread-2.12.so

查看本机监控的端口。
[root@asianux4 ~]# lsof -i
COMMAND    PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind   1330     rpc    6u  IPv4  10522      0t0  UDP *:sunrpc
rpcbind   1330     rpc    7u  IPv4  10524      0t0  UDP *:rmc
rpcbind   1330     rpc    8u  IPv4  10525      0t0  TCP *:sunrpc (LISTEN)
rpcbind   1330     rpc    9u  IPv6  10527      0t0  UDP *:sunrpc
rpcbind   1330     rpc   10u  IPv6  10529      0t0  UDP *:rmc
rpcbind   1330     rpc   11u  IPv6  10530      0t0  TCP *:sunrpc (LISTEN)
rpc.statd 1459 rpcuser    5u  IPv4  10808      0t0  UDP *:787
rpc.statd 1459 rpcuser    8u  IPv4  10816      0t0  UDP *:37593
rpc.statd 1459 rpcuser    9u  IPv4  10820      0t0  TCP *:58964 (LISTEN)
rpc.statd 1459 rpcuser   10u  IPv6  10824      0t0  UDP *:59776
rpc.statd 1459 rpcuser   11u  IPv6  10828      0t0  TCP *:39172 (LISTEN)
cupsd     1494    root    6u  IPv6  11113      0t0  TCP localhost:ipp (LISTEN)
cupsd     1494    root    7u  IPv4  11114      0t0  TCP localhost:ipp (LISTEN)
cupsd     1494    root    9u  IPv4  11117      0t0  UDP *:ipp
master    1753    root   12u  IPv4  12026      0t0  TCP localhost:smtp (LISTEN)
master    1753    root   13u  IPv6  12028      0t0  TCP localhost:smtp (LISTEN)
vsftpd    3788    root    3u  IPv4  17645      0t0  TCP *:ftp (LISTEN)
sshd      5402    root    3u  IPv4  20693      0t0  TCP asianux4:EtherNet/IP-1->192.168.232.1:ndsconnect (ESTABLISHED)
rsyslogd  5880    root    3u  IPv4  22305      0t0  UDP *:syslog
rsyslogd  5880    root    4u  IPv6  22306      0t0  UDP *:syslog
httpd     6610    root    4u  IPv6  23365      0t0  TCP *:http (LISTEN)
httpd     6613  apache    4u  IPv6  23365      0t0  TCP *:http (LISTEN)
httpd     6614  apache    4u  IPv6  23365      0t0  TCP *:http (LISTEN)
httpd     6615  apache    4u  IPv6  23365      0t0  TCP *:http (LISTEN)
httpd     6616  apache    4u  IPv6  23365      0t0  TCP *:http (LISTEN)
httpd     6617  apache    4u  IPv6  23365      0t0  TCP *:http (LISTEN)
httpd     6618  apache    4u  IPv6  23365      0t0  TCP *:http (LISTEN)
httpd     6619  apache    4u  IPv6  23365      0t0  TCP *:http (LISTEN)
httpd     6620  apache    4u  IPv6  23365      0t0  TCP *:http (LISTEN)
sshd      7652    root    3u  IPv4  26541      0t0  TCP *:ssh (LISTEN)
sshd      7652    root    4u  IPv6  26543      0t0  TCP *:ssh (LISTEN)
sshd      7654    root    3r  IPv4  26547      0t0  TCP asianux4:ssh->192.168.232.1:solid-e-engine (ESTABLISHED)
[root@asianux4 ~]#

[root@asianux4 ~]# netstat -atnup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1330/rpcbind
tcp        0      0 0.0.0.0:58964               0.0.0.0:*                   LISTEN      1459/rpc.statd
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      3788/vsftpd
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      7652/sshd
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1494/cupsd

查看远程主机开放的端口及操作系统。

[root@asianux4 ~]# nmap 10.6.65.181

Starting Nmap 5.51 ( http://nmap.org ) at 2015-09-19 00:46 CST
Nmap scan report for client (10.6.65.181)
Host is up (0.00086s latency).
Not shown: 997 filtered ports
PORT    STATE  SERVICE
21/tcp  closed ftp
22/tcp  open   ssh
443/tcp closed https
MAC Address: 00:0C:29:8C:61:1F (VMware)

Nmap done: 1 IP address (1 host up) scanned in 31.43 seconds

[root@asianux4 ~]# nmap -O 10.6.65.181

Starting Nmap 5.51 ( http://nmap.org ) at 2015-09-19 00:47 CST
Nmap scan report for client (10.6.65.181)
Host is up (0.00079s latency).
Not shown: 997 filtered ports
PORT    STATE  SERVICE
21/tcp  closed ftp
22/tcp  open   ssh
443/tcp closed https
MAC Address: 00:0C:29:8C:61:1F (VMware)
Device type: general purpose|WAP|specialized
Running (JUST GUESSING): Linux 2.6.X|2.4.X (89%), Netgear embedded (89%), Linksys Linux 2.4.X (87%), Asus Linux 2.6.X (87%), Crestron 2-Series (86%)
Aggressive OS guesses: Linux 2.6.23 - 2.6.33 (89%), Linux 2.6.31 - 2.6.34 (89%), Linux 2.6.9 - 2.6.27 (89%), Netgear DG834G WAP (89%), Linux 2.6.27 (Ubuntu 8.10) (88%), Linux 2.6.22 (Fedora Core 6) (88%), Linux 2.6.32 (88%), Linux 2.6.34 (88%), OpenWrt White Russian 0.9 (Linux 2.4.30) (87%), OpenWrt 0.9 - 7.09 (Linux 2.4.30 - 2.4.34) (87%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop

[root@asianux4 ~]# telnet 10.6.65.181 22
Trying 10.6.65.181...
Connected to 10.6.65.181.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.3

Connection closed by foreign host.
[root@asianux4 ~]#

查看主机的socket连接信息。ss和netstat命令相似
[root@asianux4 ~]# netstat -atnup|grep :21
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      3788/vsftpd
[root@asianux4 ~]# ss -antup|grep :21
tcp    LISTEN     0      32                     *:21                    *:*      users:(("vsftpd",3788,3))
[root@asianux4 ~]#

抓包工具:tcpdump
抓取FTP服务器的用户名和密码。
[root@asianux4 ~]# tcpdump -i eth0 -nn -X 'port 21'

抓取ssh服务器的通信包。
[root@asianux4 ~]# tcpdump -i eth0 host 192.168.232.1 and port 22

监控网络流量iptraf
[root@asianux4 ~]# yum install iptraf -y
[root@asianux4 ~]# unset LANG
[root@asianux4 ~]# iptraf    查看网络流量
复制代码


linux性能优化

阅读数 1

Linux性能优化

阅读数 656

linux 性能优化

阅读数 5

linux的性能优化

阅读数 1

Linux性能优化

阅读数 143

没有更多推荐了,返回首页