首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    [Linux][mm]TLB shootdown和读取smaps对性能的影响 ​

    作者遇到了业务的一个性能抖动问题,在这里介绍一下它的原因和解决办法。 分析 1,page fault 在Linux上,进程分配到的内存是虚拟内存,经过内核的页表管理,会把虚拟内存映射成物理内存。 a,在第一次访问内存的时候,会触发page fault,内核会给进程分配好内存,进程继续执行。 b,内核进行内存回收,可能会把进程的部分内存进行回收,swap到磁盘上,下次访问到再换回来。当然,这个在实际业务上未必会启用swap以防止性能下降。 c,进程自己判断,认为部分内存段时间内不会使用,会尝试把它归还给内核。它的好处是不需要修改进程的虚拟地址空间,只是把内存页面(page)归还给内核,下一次访问到的时候,会因为page fault而重新分配物理内存。 另外需要注意的时候,处理page fault的过程中,需要持有进程的内存的锁(current->mm->mmap_sem)。 2,TLB shootdown 例如某服务器有40CPU,那么就意味着可以同时运行40个task。 例如某业务有30个线程,且这30个线程都很忙,并行执行在30个CPU上。 因为30个线程共享地址空间,它们使用的是相同的页表(page table)。所以在运行这30个线程的CPU上,会加载相同的页表。 当代CPU为了加速TLB查找的速度,会使用cache,也就是说会把对应的页表项(page table entry)加载到TLB cache中。 在运行的某一个时刻,某1个线程执行了上述的page fault的case 3,也就是执行了系统调用int madvise(void *addr, size_t length, MADV_DONTNEED),想要释放1个page(4K大小),除了需要修改页表释放该page外,还需要确保CPU的TLB cache中也是没有该page的PTE的。因为如果TLB cache还有该PTE,那么CPU访问这个page就不会出错,而这个page已经被释放并分配给其他进程使用的话,就会造成安全问题。 在多核场景下,这个问题就变得更加复杂了。除了运行madvise的线程之后,还需要确保另外的29个线程运行的CPU的TLB cache也是没有该PTE的。为了实现这种效果,需要当前的CPU通知另外的29个CPU,执行clflush或者重新加载cr3。这个通知的过程需要发送IPI(inter processor interrup)。 发送IPI的这个过程,在x86上的体现就是需要CPU执行wrmsr指令,对应的操作是触发ICR。了解虚拟化的朋友应该知道,wrmsr这条指令在虚拟机上需要经过Hypervisor处理,性能更低一些。 除此之外,在执行madvise的过程中,还需要持有当前进程的内存的锁(current->mm->mmap_sem),而且这个锁的粒度比较大。 而jemalloc库,默认情况下,则会释放过期的内存,调用madvise(void *addr, size_t length, MADV_DONTNEED)。 3,smaps/smaps_rollup cat /proc/PID/smaps,可以查看进程的每一段VMA信息。

    02

    一次ORA-28000: the account is locked用户锁定的问题排查

    今天同事反映一个问题,某个测试库修改了密码,并改了相关应用使用的密码后,仍出现一会账户就被锁住,报ORA-28000: the account is locked的错误。 检查过程: 1. 查看资源限制生效参数 SQL> show parameter resource NAME                                 TYPE        VALUE ------------------------------------ ----------- ------------------------------ resource_limit                       boolean     FALSE FALSE表示未启动资源限制。 2. 查看该用户所用的PROFILE SQL> select resource_name, limit from dba_profiles where profile='DEFAULT'; RESOURCE_NAME                    LIMIT -------------------------------- ---------------------------------------- COMPOSITE_LIMIT                  UNLIMITED SESSIONS_PER_USER                UNLIMITED CPU_PER_SESSION                  UNLIMITED CPU_PER_CALL                     UNLIMITED LOGICAL_READS_PER_SESSION        UNLIMITED LOGICAL_READS_PER_CALL           UNLIMITED IDLE_TIME                        UNLIMITED CONNECT_TIME                     UNLIMITED PRIVATE_SGA                      UNLIMITED FAILED_LOGIN_ATTEMPTS            10 PASSWORD_LIFE_TIME               UNLIMITED PASSWORD_REUSE_TIME              UNLIMITED PASSWORD_REUSE_MAX               UNLIMITED PASSWORD_VERIFY_FUNCTION         NULL PASSWORD_LOCK_TIME               1 PASSWORD_GRACE_TIME              7 其中FAILED_LOGIN_ATTEMPTS表示连续登陆失败的次数,这里表示连续登陆10次失败则锁定用户。 3. 解除用户锁定ALTER USER pss3 ACCOUNT UNLOCK;后观察现象 SQL> select name, lcount from user$ where name='PSS3'; NAME                               LCOUNT ------------------------------ ---------- PSS3                                   10 不到一分钟,登陆失败次数就到10次了。 初步结论: 可能有应用仍使用旧的密码登陆,登陆失败后重复尝试,直到10次为止。 但问题就来了: 1. FAILED_LOGIN_ATTEMPTS设置为10次,但未启动resource_limit,为什么还受到10次的限制呢? 2. 怎么知道还有哪些应用由于未修改密码导致ORA错误呢? 问题1:FAILED_LOGIN_ATTEMPTS设置为10次,但未启动resource_limit,为什么还受到10次的限制呢? 这篇MOS文章160528.1(Profile Limits (Resource Parameter(s)) Are Not Enforced / Do Not Work)文章说了一些: After creating a new profile or altering an old one to limit the following profile resources there is no change:  SESSIONS_PER_USER CPU_PER_SESSION CPU_PER_CALL CONNECT_TIME IDLE_TIME L

    03

    值得一读的linux内存学习总结

    a). 进程使用的物理内存: find /proc/ -maxdepth 1 -iname "[0-9]*" | xargs -I{} cat {}/smaps | grep Pss: | awk '{s+=$2}END{print s}' b). slab分配占用的内存,采用slab机制主要是解决申请时候浪费page的问题,这一部分的内存并不是application 所占用的,所以要单独列出来, 可以在meminfo 中查看到其占用空间以及可回收空间大小. c). pagetable在虚拟地址到物理地址的转换中发挥着关键的作用,所以也不属于application占用的内存,属于系统所用,所以也单独列出来. 其大小随着内存的变大而变大,可以在meminfo 中找到占用的大小. d). free的内存,这一部分内存是从system的角度看,依然是free的,也就是说这一部分内存还没有被system 进行接管. e). cache/buffer内存的大小,这一部分可以在meminfo 中找到,这里主要是 application 的所使用的cache/buffer. f). 其他原因导致的内存gap, 在下面的示例中,上述所述的6种内存的总和大于实际的总内存,这是因为 shmem 是被application使用的,所以在计算进程使用的物理内存的时候,已经包含了shmem,而cache又计算了一次,因此最后的结果应该是减去SHMEM, 这样 和总内存相比,还有5497KB的gap .那么这个gap 到底应该是available的,还是算作used的,不得而知,那么因为这个gap 不大,所以对于内存的使用状况统计,我们可以暂且忽略该gap, 所以我们可以有如下的公式作为一个参考: total = free + cache + buffer + process_used_via_pss + slab + pagetables - shmem

    03
    领券