小米ruby15.6内存怎么自行扩张 如何给小米电脑扩展内存安装内存条

Python010

小米ruby15.6内存怎么自行扩张 如何给小米电脑扩展内存安装内存条,第1张

1、第一步就是打开后盖。

2、第二步断开电源线,白色的插头,可以用手拔。

3、第三部,看到黑色的盒子,这个盒子打开,就是内存条插槽。但要注意盒子上面有个箭头,等装好内存条后,靠个箭头的位置把盒子装进去。

4、第四步,用螺丝刀小心翘开这个盒子,要用巧劲。撬开后就可以看到内存槽了,首批配的内存是三星的,刚好装上组成双通道。最后装完内存条,全部装回去就好了。

最近在解决探针获取Ruby应用服务器的内存使用的情况,将解决的思路总结一下,希望对此感兴趣的伙伴一起探讨。

先对比应用服务器: Puma 和 Passenger ,下面对比这2个服务器内存统计,

进程模式:直接获取进程id: Process.pid

cluster模式:以启动2个worker进程为例:

从上面截图可以看到,Puma启动后会出现3个进程:1个master进程和2个worker进程。

内存的使用情况(见 RSS 列):

而对于探针来说,一个探针实例是伴随进程一起启动的,也就说一个探针只能识别自己所在的进程id,那如何获取应用服务器使用的内存?我们用其中1个woker进程所在的进程组[ PGID ]看一下:(为啥不是父进程?, 见下文Passenger)

这3个进程都在相同的进程组里,而且进程组号为master的进程id,那我们就可以用这个信息获取应用服务器的所使用的内存:

4.累加进程组内进程内存和即为应用服务器使用内存:

启动Passenger后的Process信息:

对Passenger架构感兴趣的请移步到 这儿 .

查看一下worker所在进程组和父进程:

通过PPID可以看出

Passenger core —>Passenger AppPreloader —>Passenger RubyApp

三者为爷-父-子关系,当服务器请求量增大时 AppPreloader 会产生新的进程来响应请求,从而新的 RubyApp 进程的 PPID 即为 AppPreloader 的 PID ,这样看来就可以将同一个 PPID 的进程加起来得到应用服务器的内存?

由于Passenger会根据服务器的负载量动态调整进程数,当服务器请求量较小时,Passenger会kill多余的进程,会出现下面的情况:

AppPreloader 也被Passenger杀掉了。原 RubyApp 进程的 PPID 变成了1。这时如果服务器的请求量增大,应用服务器进程会成为这样:

Passenger core 产生新的 AppPreloader 进程,并且 AppPreloader 产生新的 RubyApp 进程,这时如果只用 PPID 统计应用服务器内存就会不准确,所以要统计Passenger的使用的内存还得通过累加在同一个进程组( PGID )的所有进程使用的内存和得到。

由于 Unicorn 和 Rainbows 都与Puma的cluster模式[master+worker模式]类似,内存统计的方式可以参考上文的Puma。

由于 Thin 启动多个server后没有类似的特点,上面方法不适用于Thin,有好方法的伙伴们可以告知:smile:

在解决探针统计应用服务器的内存问题上,摸索出了上面的一条路子,如果小伙伴们有其他更好的方式,可以一起探讨一下。

我们知道Rails应用的内存占用通常都是比较高的,尤其是比较重型的全栈应用内存使用更接近1G(当然同时也包括想sidekiq这样加载整个Rails应用的ruby进程),所以我们通常对应这种情况都采取一种比较tricky的方式,使用像 puma_worker_killer 这样的监控程序,监控rails进程达到一定内存占用后将其重启。也就是说应用一开始的内存占用通常都在100~300MB之间,随着时间的推移进程会创建大量的『对象』内部又会进行数次内存分配和回收,所以内存就会不断飙升。

在我们知道了基本情况之后,那就该说说正题如何优化Rails的内存占用,解决方案有若种,我们这里讲解一个最容易实施而且见效最快的方式,就是从内存分配入手。ruby使用glibc的malloc(3)进行内存分配,这是一个比较古老的内存分配器,性能比较低分配时会产生大量碎片。所以真的这一点,现在由很多性能比较出色由兼容原有API和以及被验证过的特性的新分配器,如jemalloc和tmalloc,这里我们就使用jemalloc作为Ruby应用的内存分配器,来看看能达到什么样的优化效果。

jemalloc是facebook出品的,最早用于FreeBSD中的内存分配器,后来像firefox从3.0也开始使用它,redis从2.4之后默认在linux上使用jemalloc。既然有这么多性能敏感型的软件都使用了jemalloc那它一定有过人之处。

jemalloc的特别之处在于它融合了其他内存分配技术的优势,并且采用多级内存分配,线程池缓存tcache还有划分内存区来减少线程间锁的争用。

jemalloc结构:

多级内存分配 :jemalloc根据对象的大小,将其归为划分为 small object, large object和huge object三类

Arena : jemalloc 没有像malloc那样对内存的划分都几种在一个区域中管理,而是使用多个小块的内存区域来分别管理,内个小块称为"arena" 。

线程池缓存thread cache :tcache是分配线程的缓存空间,jemalloc使用tcache来减少线程内存分配中锁竞争,从而提升分配效率,每个tcache对应一个arena。

这一步我们来看看应用Jemalloc到我们的ruby进程中到底能有多大的提升呢。

安装

我们选择在2.4.1版本上进行测试。除了上面这种安装方式外,也可以通过gem包来安装 jemalloc-rb

内存使用

我们在同一个应用运行的两台服务器中的一个上面安装的jemalloc,而另一套作为对照组没有安装。

这里就贴出性能差距最明显的一个进程 rails应用的sidekiq进程

没有使用jemalloc的服务器上面的sidekiq进程

使用jemalloc的服务器上面的sidekiq进程

可以看到差距是很明显的,当然不是每个进程都有这样的优化效果,这个我们总结的时候再说。

从上面的jemalloc的前后对比图中我们能够看出jemalloc的优化还是有明显效果的。至于为什么sidekiq和puma之前的差距这么大,这就引出了,其实jemalloc仅是从内存分配的程度去优化和改进内存使用和性能,在你的应用程序大量产生对象,并且长久运行下去的情况时,效果就比较明显,而如果应用本身做的就比较精简,从程序角度优化的比较好的话,jemalloc的提示就不明显。所以说jemalloc可以为你的应用内存性能解燃眉之急,但是从系统性的角度出发,还是从自身出发优化好应用本身的性能。