• W.jyao
    2019-05-22
    真心看不懂了,😔😔😔

    作者回复: 多看几遍就好了

     1
     11
  • 欠债太多
    2019-05-22
    看到现在,代码越来越多,关于代码的阅读需要么?怎么去做呢

    作者回复: 重点关注流程,不关注细节

    
     9
  • 鲍勃
    2019-05-22
    果然和你的网络课程一样,越到后面越hold不住😂

    作者回复: 其实哪门课都一样哈

    
     8
  • why
    2019-05-24
    - 小内存分配, 例如分配 task_struct 对象
        - 会调用 kmem_cache_alloc_node 函数, 从 task_struct 缓存区域 task_struct_cachep(在系统初始化时, 由 kmem_cache_create 创建) 分配一块内存
        - 使用 task_struct 完毕后, 调用 kmem_cache_free 回收到缓存池中
        - struct kmem_cache 用于表示缓存区信息, 缓存区即分配连续几个页的大块内存, 再切成小内存
        - 小内存即缓存区的每一项, 都由对象和指向下一项空闲小内存的指针组成(随机插入/删除+快速查找空闲)
        - struct kmem_cache 中三个 kmem_cache_order_objects 表示不同的需要分配的内存块大小的阶数和对象数
        - 分配缓存的小内存块由两个路径 fast path 和 slow path , 分别对应 struct kmem_cache 中的 kmem_cache_cpu 和 kmem_cache_node
        - 分配时先从 kmem_cache_cpu 分配, 若其无空闲, 再从 kmem_cache_node 分配, 还没有就从伙伴系统申请新内存块
        - struct kmem_cache_cpu 中
            - page 指向大内存块的第一个页
            - freelist 指向大内存块中第一个空闲项
            - partial 指向另一个大内存块的第一个页, 但该内存块有部分已分配出去, 当 page 满后, 在 partial 中找
        - struct kmem_cache_node
            - 也有 partial, 是一个链表, 存放部分空闲的多个大内存块, 若 kmem_cacche_cpu 中的 partial 也无空闲, 则在这找
        - 分配过程
            - kmem_cache_alloc_node->slab_alloc_node
            - 快速通道, 取出 kmem_cache_cpu 的 freelist , 若有空闲直接返回
            - 普通通道, 若 freelist 无空闲, 调用 `__slab_alloc`
            - `__slab_alloc` 会重新查看 freelist, 若还不满足, 查看 kmem_cache_cpu 的 partial
            - 若 partial 不为空, 用其替换 page, 并重新检查是否有空闲
            - 若还是无空闲, 调用 new_slab_objects
            - new_slab_objects 根据节点 id 找到对应 kmem_cache_node , 调用 get_partial_node
            - 首先从 kmem_cache_node 的 partial 链表拿下一大块内存, 替换 kmem_cache_cpu 的 page, 再取一块替换 kmem_cache_cpu 的 partial
            - 若 kmem_cache_node 也没有空闲, 则在 new_slab_objects 中调用 new_slab->allocate_slab->alloc_slab_page 根据某个 kmem_cache_order_objects 设置申请大块内存
    - 页面换出
        - 触发换出:
        - 1) 分配内存时发现没有空闲; 调用 `get_page_from_freelist->node_reclaim->__node_reclaim->shrink_node`
        - 2) 内存管理主动换出, 由内核线程 kswapd 实现
        - kswapd 在内存不紧张时休眠, 在内存紧张时检测内存 调用 balance_pgdat->kswapd_shrink_node->shrink_node
        - 页面都挂在 lru 链表中, 页面有两种类型: 匿名页; 文件内存映射页
        - 每一类有两个列表: active 和 inactive 列表
        - 要换出时, 从 inactive 列表中找到最不活跃的页换出
        - 更新列表, shrink_list 先缩减 active 列表, 再缩减不活跃列表
        - 缩减不活跃列表时对页面进行回收:
            - 匿名页回收: 分配 swap, 将内存也写入文件系统
            - 文件内存映射页: 将内存中的文件修改写入文件中
    展开
    
     7
  • 活的潇洒
    2019-05-22
    花了4个多小时终于把笔记做完
    分享给大家:
    https://www.cnblogs.com/luoahong/p/10907734.html

    作者回复: 赞

    
     7
  • 刘強
    2019-05-22
    这几节看起来吃力了,需要理解的外围知识很多!

    作者回复: 加油,多看几遍

    
     7
  • 超超
    2019-07-17
    1.系统在什么情况下才会使用SWAP?

    实际上,并不是等所有的物理内存都消耗完毕之后,才去使用swap的空间,什么时候使用是由swappiness 参数值控制。
    [root@rhce ~]# cat /proc/sys/vm/swappiness

    60
    该值默认值是60.

    swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,

    swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。

    现在服务器的内存动不动就是上百G,所以我们可以把这个参数值设置的低一些,让操作系统尽可能的使用物理内存,降低系统对swap的使用,从而提高系统的性能。

    展开
    
     4
  • 超超
    2019-07-17
    参考文章:https://mp.weixin.qq.com/s/6JVpke8bDKI9lvh_l6QF-w

    作者回复: 赞

    
     2
  • 超超
    2019-07-17
    3. 如何查看swap分区
    swapon -s
    cat /proc/swaps
    free
    vmstat
    以上4类命令都可以查看swap分区的大小和使用情况
    展开

    作者回复: 赞

    
     2
  • 超超
    2019-07-17
    2. 如何修改swappiness参数?

    --临时性修改:

    [root@rhce ~]# sysctl vm.swappiness=10

    vm.swappiness = 10

    [root@rhce ~]# cat /proc/sys/vm/swappiness
    10
    这里我们的修改已经生效,但是如果我们重启了系统,又会变成60.

    --永久修改:
    在/etc/sysctl.conf 文件里添加如下参数:
    vm.swappiness=10
    或者:
    [root@rhce ~]# echo 'vm.swappiness=10' >>/etc/sysctl.conf

    保存,重启,就生效了。
    展开

    作者回复: 如此认真,典范啊

    
     1
  • guojiun
    2019-05-22
    https://events.static.linuxfound.org/sites/events/files/slides/slaballocators.pdf 這裡有清楚的視意圖,對照著看會更清楚!

    作者回复: 赞

    
     1
  • Geek_54edc1
    2019-12-11
    kmem_cache应该是种高速缓存,用来解决对象频繁分配和释放的问题,其实就是直接把不用的对象在放回链表里,而不是释放对象的内存
    
    
  • 俩孩儿他爸
    2019-08-29
    老师,slub存在回收机制吧?就是slub中空闲很多的时候,是不是会这些内存块释放,返回给系统呢?

    作者回复: 一个内存块的slub全部释放之后,整个页都会回收

    
    
  • 俩孩儿他爸
    2019-08-29
    老师,kmem_cache_cpu中的page和partial不是指向同一块内存区域的吧,为什么会这么设计呢?partial的作用是什么呢?

    作者回复: 不是同一块的。备用列表,当 page 满了,就会从这里找

    
    
  • 栋能
    2019-07-23
    我想知道文中 “对于缓存来讲,其实就是分配了连续几页的大内存块,然后根据缓存对象大小,切成小内存块” 中,小内存块和页大小是怎么个关系?按我的理解小内存块就是task_struct对象大小,一个页中有很多。而kmem_cache_cpu中对于中freelist是大内存块中的项,这个这个项和小内存块或task_struct有个什么关系?是大小一样呢,还是怎个关系?还有最后讲页面换出单位是内存节点,这个节点不可能是整个NUMA节吧,是指啥我没看明白

    作者回复: 这里的意思是每个NUMA节点,自己换出自己的,不是将整个NUMA节点都换出

    
    
  • 深几
    2019-07-10
    kswapd 在内存紧张的时候,开始工作,那么这个紧张的条件是什么?总的物理内存还是按照 zone 来区分呢?

    作者回复: 对每个NUMA结点来说,都有一个单独的kswapd守护进程

    
    
  • skye
    2019-06-21
    老师能讲讲大块内存的分配吗

    作者回复: mmap

    
    
  • Geek_54edc1
    2019-06-12
    查看分区情况:/proc/swaps
    
    
  • zhj
    2019-05-30
    麻烦问下,换出不活跃物理页的时候,对于原来进程A是无感知的,A中的页表保存了虚拟地址到物理地址的映射,在A视角看来还是原来大小的内存,但当A需要访问这个不活跃的页时,这个映射关系已经不成立,所以我的问题就是当换出发生的时候,对A的页表是进行了什么特殊处理,望老师答疑下

    作者回复: 在页表做了标记,说明已经换出了

    
    
  • 川云
    2019-05-28
    讲得真好,深入到代码层面,否则要是自己研究太困难了,不过也确实需要一定的Linux基础,根据老师的讲解再去看下linux内核的书籍,会提升的更快的

    作者回复: 谢谢,这门课主要强调流程,代码是个印证,不适合作为特别严肃的代码分析书籍看,为了突出内核工作机制和流程,删除和省略了很多内核代码

    
    
我们在线,来聊聊吧