主要内容

硬件 策略
CPU 进程调度、系统调用、中断
内存 内存管理
外存 文件IO
网络 协议栈
其他 时间管理


进程调度

内核的运行时间

系统启动、中断发生、系统调用以及内核线程

进程和线程的区别

  • 在linux中,底层都是调用clone函数。
  • 进程创建为60~8000次/s,线程为5~10w/s
  • 进程创建调用fork(),主要瓶颈在页表复制,如果一个进程没有访问内存,页表共享的内存栈不需要复制页表。(例如:一个网络处理服务,只是收到包,fork进程进行内存访问,性能应该在一万左右,但是如果主进程简单做一些处理的话,性能就会下降为一千左右。)
  • 线程创建调用pthread_create(),主要瓶颈在堆栈(8k)分配上,如果并发线程增多1w时约为5w
  • 并发性能CPU切换,进程30~100w/s,线程50~150w/s
  • 内存消耗,进程要比线程更消耗内存(3~N倍)

进程调度

  • sched_yield更细粒度让出cpu
  • 各个核都有自己的运行队列
  • 就近balance原则,运行clone、wakeup的进程就在该核
  • CPU绑定函数sched_setaffinity

中断

  • 通过/proc/interrupt查看中断
  • 中断主要来源于时钟、网卡、硬盘
  • 通过/proc/irq/N/smp_affinity查看在那个核
  • 调度顺序:硬中断调度->软中断->进程调度

常用系统调用性能

是在C类机器测试,自己使用最好在自己的机器类型测试。

性能(次/秒)
ntohl 2.5亿
memset 1k 150w
getppid 100w
gettimeofday 30~400w
time 30w~400w~1000w
shmget 300w
shmat 40w
socket 10w~50w
sendto 40w
fork
pthread_create 5~10w

工具

  • strace
  • perf

内存管理

  • 查看进程地址空间/proc/PID/maps或者pmap
  • 防止内存交换出去调用mlock,如果内存使用非常紧张的时候得注意
  • 空闲内存计算:/proc/meminfo查看,MemFree+cached+buffer-Mapped

共享内存建立方法

  • IPC 我们经常使用
  • shm_open,文件操作,方便append和dump
  • tmpfs可以直接挂载到某个盘
  • hugetlbfs节省页表空间

内存权限

shared private
File 共享内存 数据段、代码段
anon 父子进程

文件IO

文件系统层次架构

  • VFS Layer
  • NFS EXT2 EXT3 NTFS
  • Page Cache
  • Generic Block Layer
  • I/O Scheduler Layer
  • Block Device Driver Layer
  • Block Device Layer

PageCache起了缓存得作用,采用read ahead机制,如果我们顺序读性能比较好,随机读性能就比较差了。对于写,如果在pagecache中存在,那么直接写PacheCache中的页就可以,否则需要加载该页内容,然后写入PageCache,最后delay write。

虚拟文件系统为filetab[fd]->file->dentry->inode->mapping.dentry采用全局hash,查找性能为30~35w/s,100w个文件也为30w/s。

EXT3添加了日志模式,由高到低为journal、ordered、writeback

协议栈

  • recv_queue中的包大小,为内核的包大小,而不是ip包大小。

  • 如果发出去的包太大,需要修改write_queue和tx_queue两个参数,tx_queue主要是流量控制。
  • 多进程必须在socket后再fork,即使设置了REUSEADDR,从hashtable看出原因。
  • net.ipv4.tcp_max_syn_backlog参数决定了SYN_RECV状态队列的数量,一般默认值为512或者1024,即超过这个数量,系统将不再接受新的TCP连接请求.
  • sync cookie,外网要注意,同一个集线器来的用户,可能导致大量不可以建立链接。
  • somaxconn决定了listen监听队列的大小
  • select有1024的限制,即使没有达到1024,但是分配的fd大于1024也会有问题。
  • epoll多用于单进程多线程

时间

  • gettimeofday根据硬件不同性能差距很大
  • usleep(1),睡眠不一定是1微妙,有可能是毫秒级的,也和硬件有关。

参考文献

man 2

man 7

ULK

Linux内核策略介绍学习笔记的更多相关文章

  1. Linux内核策略介绍

      Linux内核策略介绍学习笔记   主要内容 硬件 策略 CPU 进程调度.系统调用.中断 内存 内存管理 外存 文件IO 网络 协议栈 其他 时间管理 进程调度 内核的运行时间 系统启动.中断发 ...

  2. Linux内核Inotify机制学习笔记

    一.Inotify简介: Inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入.它是一个内核用于通知用户空间程序文件系统变化的机制.开源社区提出用户态需要内核提供一些机制,以便用 ...

  3. 《Linux内核分析》读书笔记(四章)

    <Linux内核分析>读书笔记(四章) 标签(空格分隔): 20135328陈都 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行 ...

  4. Linux内核分析第一次学习报告

    Linux内核分析第一次学习报告 学生 黎静 学习内容 1.存储程序计算机工作模型 冯诺依曼体系结构:核心思想为存储程序计算机. CPU抽象为for循环,总是执行下一条指令,内存保存指令和数据,CPU ...

  5. Linux——帮助命令简单学习笔记

    Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...

  6. Linux内核设计与实现笔记_1_基本概念

    Linux内核设计与实现笔记_1_基本概念 操作系统 系统这个词包含了操作系统和所有运行在它上面的应用程序.操作系统是指在整个系统中负责完成分最基本功能和系统管理的那些部分,这些部分应该包括: 内核, ...

  7. Linux内核(16) - 高效学习Linux内核

    世界悲结束了,章鱼哥也退役了,连非诚勿扰中的拜金女也突然的少了很多.这本<Linux内核修炼之道>在卓越.当当.china-pub上也已经开卖了,虽然是严肃文学,但为了保证流畅性,大部分文 ...

  8. Linux内核(17) - 高效学习Linux驱动开发

    这本<Linux内核修炼之道>已经开卖(网上的链接为: 卓越.当当.china-pub ),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到 ...

  9. 20135320赵瀚青LINUX第八周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周学习的是linux ...

随机推荐

  1. python中mysql主从同步配置的方法

    1)安装mysql ubuntu中安装一台mysql了,docker安装另外一台mysql 获取mysql的镜像,主从同步尽量保证多台mysql的版本相同,我的ubuntu中存在的mysql是5.7. ...

  2. mac安装ruby-oci8

    1.安装xcode 2.从oracle官网下载以下安装包 instantclient-basic-macos.x64-12.1.0.2.0.zip instantclient-sdk-macos.x6 ...

  3. C语言小程序-基于链表的学生信息管理

    程序支持增加.查询.删除.存盘和读取操作 一 程序定义和函数声明 头文件studentsys.h定义如下 /* student management system by list */ #ifndef ...

  4. Qt——styleSheet

    1.两个地方调用 QWidget::setStyleSheet() QApplication::setStyleSheet() 2.基本语法 selector {attribute : value} ...

  5. 不使用IDE,用maven命令打包war项目及出现的问题解决(最全攻略,亲测有效)

    第一次在博客园写博客,写的不好大家见谅啊!! 一.首先,在用maven打包之前,一定确认好你使用的jdk版本和maven的版本,最好就是用jdk1.8和maven3.3以上的,版本太低了容易出现一些意 ...

  6. OpenCV 3.2 FlannBasedMatcher

    #include <iostream> #include <string> #include <boost/timer.hpp> #include "op ...

  7. spring源码-自定义标签-4

    一.自定义标签,自定义标签在使用上面相对来说非常常见了,这个也算是spring对于容器的拓展.通过自定义标签的方式可以创造出很多新的配置方式,并且交给容器直接管理,不需要人工太多的关注.这也是spri ...

  8. UpdateLog

    2014-10-20 增加数据适配器,使支持多数据库类型2015-01-08 增加没有主键ID的抽象类,使能自义主键字段实现MODEL 增加虚拟字段转换,将指定函数或语法转换为对象属性,灵活性更大了 ...

  9. hdu2066一个人的旅行(floyd优化)

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  10. linux命令(实用!)

    本文转载自网络 1.1 shell家族 shell:命令解释器,根据输入的命令执行相应命令. 察看当前系统下有哪些shell: cat /etc/shells 察看当前系统正在使用的shell ech ...