物理内存

Linux性能调优的优化思路

空扰寡人 提交于 2020-02-25 16:03:37
Linux操作系统是一个开源产品,也是一个开源软件的实践和应用平台,在这个平台下有无数的开源软件支撑,我们常见的有apache、tomcat、nginx、mysql、php等等,开源软件的最大理念就是自由、开放,那么Linux作为一个开源平台,最终要实现的是通过这些开源软件的支持,以低廉的成本,达到应用最有的性能。因此,谈到性能问题,主要实现的是Linux系统和应用程序的最佳结合。 博文大纲: 一、性能问题综述 二、影响Linux性能的因素 三、分析系统性能设计的人员 四、调优总结 一、性能问题综述 系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员会经常遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个web服务,经常会出现网页打不开、打开速度慢等现象,而遇到这些问题,就会有人抱怨Linux系统不好,其实这些都是表面现象。操作系统完成一个任务时,与系统自身设置、网络拓补结构、路由设备、路由策略、接入设备、物理线路等多个方面都紧密相关,任何一个环节出现问题,都会影响整个系统的性能。因此当Linux应用出现问题是,应当从应用程序、操作系统、服务器硬件、网络环境等方面综合排查,定位问题出现在那个部分,然后集中解决。 在应用程序、操作系统、服务器硬件、网络环境等方面。影响性能最大的是应用程序和操作系统两个方面,因为这两个方面出现的问题不易察觉

虚拟内存(摘自百度百科)

喜你入骨 提交于 2020-02-25 07:06:11
虚拟内存是计算机系统 内存管理 的一种技术。它使得 应用程序 认为它拥有连续的可用的 内存 (一个连续完整的 地址空间 ), 而实际上,它通常是被分隔成多个 物理内存 碎片,还有部分暂时存储在外部 磁盘存储器 上,在需要时进行 数据交换 。 简介 别称虚拟存储器(Virtual Memory)。电脑中所运行的程序均需经由 内存 执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题, Windows 中运用了虚拟内存 [1] 技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。若计算机运行程序或操作所需的 随机存储器 ( RAM )不足时,则 Windows 会用虚拟存储器进行补偿。它将计算机的RAM和 硬盘 上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“ 分页 文件”的空间中。将数据移入分页文件可释放RAM,以便完成工作。 一般而言,计算机的RAM容量越大,程序运行得越快。若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因而扩增RAM容量(可加内存条)是最佳选择。    虚拟内存不足的成因   【1】、 感染病毒 :有些病毒发作时会占用大量内存空间,导致系统出现 内存不足 问题。   【2】

通过/dev/mem操作物理内存

三世轮回 提交于 2020-02-23 17:36:38
  /dev/mem设备可以用来访问物理内存。下面一段应用程序的代码,实现了通过/dev/mem对物理内存空间中SRAM1的访问。 #include <stdio.h> #include <stdint.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #define SRAM1_ADDR 0x10000000 struct test_data { int32_t val; }; int main(void) { struct test_data *data; int ret = 0; void *base; int fd; fd = open("/dev/mem", O_RDWR | O_SYNC); if (fd == -1) { printf("failed to open /dev/mem!"); return -1; } base = mmap(NULL, sizeof(struct test_data), PROT_READ | PROT_WRITE, MAP_SHARED, fd, SRAM1_ADDR); if (base == MAP_FAILED) { printf("failed to mmap /dev/mem!"); ret = -1; goto err_mmap; } data

Linux命令行工具之free命令

蹲街弑〆低调 提交于 2020-02-21 07:24:35
原创转载请注明出处: https://www.cnblogs.com/agilestyle/p/11524691.html 使用 free 查看整个系统的内存使用情况 Note:不同版本的free输出可能会有所不同 第一列,total 是总内存大小; 第二列,used 是已使用内存的大小,包含了共享内存; 第三列,free 是未使用内存的大小; 第四列,shared 是共享内存的大小; 第五列,buffers是缓冲区的大小 第六列,cached是缓存的大小 使用 top 查看进程的内存使用情况 top 输出界面的顶端,也显示了系统整体的内存使用情况,这些数据跟 free 类似。接着看下面的内容,跟内存相关的几列数据,比如 VIRT、RES、SHR 以及 %MEM 等。 这些数据,包含了进程最重要的几个内存使用情况。 VIRT 是进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内。 RES 是常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 swap 和共享内存。 SHR 是共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及程序的代码段等。 %MEM 是进程使用物理内存占系统总内存的百分比。 除了要认识这些基本信息,在查看 top 输出时,还要注意两点。 第一,虚拟内存通常并不会全部分配物理内存。从上面的输出

Linux线程栈内存总结

落爺英雄遲暮 提交于 2020-02-20 17:57:42
何为线程栈空间泄露? 何为anon内存? 虚拟内存、物理内存、anon内存的联系 anon与线程的联系 glibc源码库线程创建与销毁anon关系 使用pmap分析虚拟地址空间以及anon内存 何为线程栈空间泄露? 【栈空间泄露】:简单了说就是,创建了线程,系统分配了内存,但是由于异常操作,没有把之前申请的内存还给操作系统,缓存在进程中,导致这块的内存被占用,系统无法分配内存给其他进程。 从用户角度,线程创建后,未设置线程为detach属性,pthread_detach()、pthread_join()销毁函数。 从内存映射角度,在进程中缓存一些无法利用的anon内存。 从系统栈空间分配角度,这些运行结束但是未销毁的线程,既不放在stack_used队列里,也不放在stack_cache,从而线程栈空间不会被调度到。 何为anon内存? 仅个人观点,在操作系统上运行进程,其实是经过两次映射。一次是用户程序到系统配置器分配的虚拟内存申请,一次是虚拟地址空间到物理空间地址的映射,如果是第二次映射建立前,在申请物理空间,未填充物理页内容,建立映射后,仅仅代表已经分配了内存anon,ps:物理空间最小管理单元是“页”。 虚拟内存 操作系统给用户程序的假象地址,与物理内存建立映射关系。 物理内存 类似物理存储器DRAM anon内存 1.调用malloc、brk

C语言内存小结

人盡茶涼 提交于 2020-02-20 13:05:12
学习C语言是了解内存布局的最简单、最直接、最有效的途径, 它比任何一门高级编程语言都贴近内存。以前学习C语言内存也有一段时间,却也是零零散散,于是打算写一篇博客,整理一下关于内存的内容。 内存优化小结: 计算机内存是以字节(Byte)为单位划分的,理论上CPU可以访问任意编号的字节,但是由于内存对齐(编译器的优化),情况就有所不同; CPU 通过地址总线来访问内存,一次能处理几个字节的数据,就命令地址总线读取几个字节的数据。32 位的 CPU 一次可以处理4个字节的数据,那么每次就从内存读取4个字节的数据,这就是意味着CPU读取的内存单元的标号一定是4的倍数;对于程序来说,一个变量最好位于一个寻址步长的范围内,这样一次就可以读取到变量的值;如果跨步长存储,就需要读取两次,然后再拼接数据,效率显然降低了。 例如一个 int 类型的数据,如果地址为 8,那么很好办,对编号为 8 的内存寻址一次就可以。如果编号为 10,就比较麻烦,CPU需要先对编号为 8 的内存寻址,读取4个字节,得到该数据的前半部分,然后再对编号为 12 的内存寻址,读取4个字节,得到该数据的后半部分,再将这两部分拼接起来,才能取得数据的值。 64位的处理器也是这个道理,同样的分析。 虚拟地址小结: 虚拟地址在寄存器层面是段地址+偏移地址,这两个地址通过内部总线传输到CPU的内部结构—

物理内存和虚拟内存

十年热恋 提交于 2020-02-16 19:22:56
1.物理内存和虚拟内存 直接从物理内存读取数据比从硬盘读写数据要快得多,因此,我们希望所有的数据的读写在内存中完成,但是内存是有限的,这样就引出了物理内存与虚拟内存的概念。 物理内存是系统硬件提供的内存大小,是真正的内存。虚拟内存是为了满足物理内存不足而提出的策略,利用磁盘空间虚拟出一块逻辑内存,用作虚拟内存的磁盘空间称为交换空间。 作为物理内存的扩展,Linux未在物理内存不足时,使用交换分区的虚拟内存(内核将暂时不用的内存块信息写到交换空间,物理内存得到释放并能用于其他地方,当需要用到原始内容时,这些信息会被重新从交换空间读入物理内存)。 Linux的内存管理采取的是分页存取机制。为了保证物理内存能得到充分利用,内核在适当时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,经常使用的信息保留到物理内存中。 2.深入了解Linux内存运行机制: 首先,Linux系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存。即使并没什么事情需要内存,Linux也会交换出暂时不用的内存页面,可以避免等待交换所需的时间。 Linux 进行页面交换时不是多有的页面在不用时都交换到虚拟内存中。Linux内核根据“最近经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存中。有时我们会看到这么一个现象:Linux物理内存还有很多,但是交换空间也使用了很多

Linux命令之top

痞子三分冷 提交于 2020-02-16 13:28:27
  由于公司的产品基于Linux开发,不可避免的使用Linux命令,除了一些常用的最基本的外,偶尔也会用到一些较为生疏的,近几日在测试某MR的功能,由于公司产品也是基于大数据的,所以,对性能方面也需要关注,虽然家里环境完全比不上现场环境,家里也不做性能测试,但还是要看下的,今天拿出时间来专门看了下top这个命令。top命令在Linux中的作用是实时显示系统各个进程的资源占用情况,与windows的任务管理器类似。作为主要查看的监控,swap的变化值得注意,如果swap交换区的used不断的变化,说明物理内存不断在和swap交换区的数据进行交换处理,这就说明内存真的不够用了 前五行为统计信息区: 第一行:任务队列信息,同uptime命令的执行结果,具体参数 说明情况如下: 17:16:10 当前系统时间 up 4 days 7:18 系统已经运行了4天7小时18分钟 8 users 当前有8个用户登录系统 load average 2.18,2.37,2.20 分别是1分钟、5分钟、15分钟的 负载情况,该处的数值是系统每隔5秒检查一次活跃的进程数,然后按照特定的算法计算出的。如果这个数值除以逻辑CPU的数量,结果高于5则表示已经超负载了 第二行:task任务进程 系统现在有205个进程,处于运行状态的有1个,204个在休眠,停止状态的0个,僵尸状态的0个 第三行:cpu状态信息,

「Nosql」Redis小记-内存解析&内存消耗篇

痴心易碎 提交于 2020-02-15 05:40:42
🍄 博客搬家:初版发布于 2017/08/12 18:32 🌺 原博客地址: https://my.oschina.net/sunqinwen/blog/1507171 前置:redis内存指标 注:本文默认读者已初步学会使用redis了。 首先我们通过info命令查看相关指标,其中几个memory的重要指标整理出来如下: 属性 解释 used_memory redis内部存储的所有数据的内存总占用量(自身内存+对象内存+缓冲内存) used_memory_ress redis进程占用的总物理内存 mem_fragmentation_ratio used_memory_ress与used_memory的比值,即为内存碎片率 mem_allocator 内存分配器,默认为jemalloc 一、碎片率 ① 当 内存碎片率>1 时,说明redis进程占用物理内存的总量大于Redis实际存储数据(表1-1第一行)的内存占用量,溢出来的部分内存被内存碎片消耗,如果溢出部分过大,则说明内存碎片率严重。 ② 相反的,如果 碎片率<1 时,则说明Redis存储的数据总量已经超出了redis进程占用内存的总量,造成这种情况是因为操作系统把Redis内存交换至硬盘导致(swap),由于硬盘读取速度远远慢与内存,因此这种情况下redis性能极差,可能出现僵死。 二、redis内存消耗的几个来源 2.1:

Linux内存管理-高端内存(一)

江枫思渺然 提交于 2020-02-15 00:58:06
高端内存是指物理地址大于 896M 的内存。对于这样的内存,无法在“内核直接映射空间”进行映射。 为什么?   因为 “内核直接映射空间”最多只能从 3G 到 4G,只能直接映射 1G 物理内存,对于大于 1G 的物理内存,无能为力 。   实际上,“内核直接映射空间”也达不到 1G, 还得留点线性空间给“内核动态映射空间” 呢。   因此,Linux 规定 “内核直接映射空间” 最多映射 896M 物理内存 。   对于高端内存,可以通过 alloc_page() 或者其它函数获得对应的 page,但是要想访问实际物理内存,还得把 page 转为线性地址才行(为什么?想想 MMU 是如何访问物理内存的),也就是说,我们需要 为高端内存对应的 page 找一个线性空间,这个过程称为高端内存映射。 高端内存映射有三种方式: 1、 映射到“内核动态映射空间”   这种方式很简单,因为通过 vmalloc() ,在“内核动态映射空间”申请内存的时候,就可能从高端内存获得页面(参看 vmalloc 的实现),因此说 高端内存有可能映射到“内核动态映射空间” 中 。 2、 永久内核映射   如果是通过 alloc_page() 获得了高端内存对应的 page,如何给它找个线性空间?    内核专门为此留出一块线性空间,从 PKMAP_BASE 到 FIXADDR_START