swShareMemory_mmap_create:mmap(248000096) failed / Error: Cannot allocate memory[12]

本文主要是介绍swShareMemory_mmap_create:mmap(248000096) failed / Error: Cannot allocate memory[12],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

启用swoole时报的错误,可以确定是内存问题

 
[2019-04-09 09:04:32 @220.0]    WARNING swShareMemory_mmap_create: mmap(260046944) failed. Error: Cannot allocate memory[12]
[2019-04-09 09:04:32 @220.0]    ERROR   calloc[1] failed
    我们查看下内存:

 

[root@VM_0_17_centos docker]# free -m
              total        used        free      shared  buff/cache   available
Mem:            992         495          85         116         412         216
Swap:             0           0           0
    swap全都是0明显有问题,那就加点swap:

 

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 #增加1G的
sudo mkswap /swapfile
sudo swapon /swapfile


[root@VM_0_17_centos docker]# free -m
              total        used        free      shared  buff/cache   available
Mem:            992         494          72         116         426         217
Swap:          1023         419         604
 

    然后就顺利启用swoole了。

 
 
free -m命令详解
[root@localhost ~]# free -m
 
             total       used       free     shared    buffers     cached
 
Mem:          7869       7651        218          1        191       5081
 
-/+ buffers/cache:       2378       5490
 
Swap:          478        139        339

total1:表示物理,内存总量1,2表示1,2行的内容

used1:总计分配给缓存(包含Buffer和cache)使用的数量,但其中可能部分缓存并未实际使用

free1:未被分配的内存

shared1:共享内存,一般系统不会用到,这里也不讨论

buffers1:系统分配但未被使用的buffers数量

cached1:系统分配但未被使用的cache数量

used2:实际使用的buffers和cache总量,也是实际使用的内存总量

free2:未被使用的Buffers和cache和未被分配的内存之和,这就是系统当前实际可用内存。

如下公式:

buffer和cache也是内存的一部分,如果需要,可以释放这2部分的内存

pagecache和buffercache的区别:

pagecache实际上是针对文件系统的,是文件的缓存,在文件上的数据会缓存到pagecahce,文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成,当pagecache中的数据需要刷新时,pagecache中的数据交给buffercache。但这种处理在2.6版本内核之后就变得简单了,没有真正意义的cache操作。

buffercache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘操作的数据会缓存到buffercache中,如:文件系统的元数据都会缓存到buffercache中。简单来说,

pagecache用来缓存文件数据,buffercache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,数据会缓存到pagecache。若直接采用dd工具对磁盘进行读写,那么数据会

缓存到buffercache。

cache和buffer的区别:

a buffer is something that has yet to be "written" to disk

a cache is something that has been "read" from the disk and stored for later use

对于共享内存(shared memory) :主要用于在unix下不同进程间共享数据,是进程间通信的一种方法,一般的应用程序不会申请共享内存。

cache:高速缓存,是位于CPU和主内存间一种容量较小但速度很高的存储器。由于CPU从主内存获取数据要等待一段时间,cahce中保存这CPU刚用过或循环使用的一部分数据,CPU再次使用该部分数据时,可从cache中直接调用,这样就减少了CPU的等待时间。cache又分为L1和L2,L2早期焊在主板上,现在都在CPU中。常见的L2容量有256KB和512KB

3.free中的buffer和cache都是基于内存

buffer作为buffercache的内存,是块设备的读写缓冲区,

cache作为pagecache的内存,文件系统的cache

如果cache的值很大,说明cache中的文件数很多,如果频繁访问到的文件都能被cache住,那么磁盘的读IO必会非常小。

如何释放cachememory:

To free pagecache:echo 1 > /proc/sys/vm/drop_cachesTo free dentries and inodes:echo 2 > /proc/sys/vm/drop_cachesTo free pagecache, dentries and inodes:echo 3 > /proc/sys/vm/drop_caches

  

#注意,释放前最好sync一下,防止丢失数据,但是<strong>一般情况下没有必要手动释放内存<br></strong>

总结:

cache是cpu和内存之间的,buffer是内存和磁盘之间的,都是为了解决速度不对等的问题。

缓存(cache)是把读取过来的数据保存起来,重新读取时若命中,就不去硬盘了,若没有命中就去读硬盘,其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读取的内容不断往后排,直至从中删除。

缓冲(buffer)时根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的的反复寻道,从而提高系统性能,linux有一个守护进程定期清空缓冲内容(即写入磁盘)。

也可以通过sync命令手动清空缓冲。举个例子:我这里有个ext2的的u盘,我往里面cp一个3M的mp3,但u盘的灯没有跳动,过了一会(或者手动输入sync),U盘的灯就跳动起来了。卸载设备时会清空缓存,所以有时候卸载一个设备要等上几秒中。

修改/etc/sysctl.conf中的vm.swappiness右边的数字可以在下次开机时调节swap使用策略。该数字范围是0~100,数字越大越倾向于使用swap。默认为60,可以改一下试试。–两者都是RAM中的数据。

buffer是即将要写入磁盘的,而cache是被从磁盘中读出来的。

buffer由各种进程分配,被用在如输入队列等方面。一个简单的例子是某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。

cache经常被用在磁盘的I/O请求上,如果有多个进程要访问某个文件,于是该文件被做成cache以便下次被访问,这样可以提高系统性能。

Buffer Cachebuffer cache,又称bcache,其中文名称为缓冲器高速缓冲存储器,简称缓冲器高缓。另外,buffer cache按照其工作原理,又被称为块高缓
 

这篇关于swShareMemory_mmap_create:mmap(248000096) failed / Error: Cannot allocate memory[12]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652206

相关文章

解决Maven项目报错:failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题

《解决Maven项目报错:failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题》这篇文章主要介... 目录Maven项目报错:failed to execute goal org.apache.maven.pl

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

Pycharm安装报错:Cannot detect a launch configuration解决办法

《Pycharm安装报错:Cannotdetectalaunchconfiguration解决办法》本文主要介绍了Pycharm安装报错:Cannotdetectalaunchconfigur... 本文主要介绍了Pycharm安装报错:Cannot detect a launch configuratio

ImportError: cannot import name ‘print_log‘ from ‘logging‘

mmcv升级到2.+后删除了很多 解决 查FAQ文档,找到 添加到mmcv.utils下即可

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods

android java.io.IOException: open failed: ENOENT (No such file or directory)-api23+权限受权

问题描述 在安卓上,清单明明已经受权了读写文件权限,但偏偏就是创建不了目录和文件 调用mkdirs()总是返回false. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_E

UserWarning: mkl-service package failed to import

安装完成anaconda,并设置了两个环境变量  之后再控制台运行python环境,输入import numpy as np,提示错误 D:\InstallFolder\Anaconda3\lib\site-packages\numpy\__init__.py:143: UserWarning: mkl-service package failed to import, therefore

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

Python安装llama库出错“metadata-generation-failed”

Python安装llama库出错“metadata-generation-failed” 1. 安装llama库时出错2. 定位问题1. 去官网下载llama包 2.修改配置文件2.1 解压文件2.2 修改配置文件 3. 本地安装文件 1. 安装llama库时出错 2. 定位问题 根据查到的资料,发现时llama包中的execfile函数已经被下线了,需要我们手动修改代码后