关于Nginx mmap(MAP_ANON|MAP_SHARED, 314572800)报错
mmap 报错解决
今天修改了一下测试环境的Nginx的nginx.conf,然后做检测的时候报了一个错误
/usr/local/bin/nginx -c /usr/local/etc/openresty/conf/nginx.conf -t
nginx: [alert] mmap(MAP_ANON|MAP_SHARED, 314572800) failed (12: Cannot allocate memory)
nginx: configuration file /usr/local/etc/openresty/conf/nginx.conf test failed
报错提示很清楚,不能分配内存了。为什么不能分配内存了?基本上就是物理内存不够使用了,先查了下内存
free -m
total used free shared buff/cache available
Mem: 990 568 75 54 347 224
Swap: 0 0 0
可以看到,真正可以被使用的内存大概就是224M。那就是Nginx此次检查的配置需要使用大于224M的内存。按理说,Nginx自身不需要多少内存。我们系统中大量使用openresty,首先怀疑可能openresty的某个引用申请内存过多了,然后查找了下配置,果然发现openresty的共享内存的使用。
lua_shared_dict xxx 300m;
lua_shared_dict yyy 100m;
总共需要400M内存,这两个共享内存该小点应该就可以了。改为
lua_shared_dict xxx 100m;
lua_shared_dict yyy 30m;
然后检查通过
/usr/local/bin/nginx -c /usr/local/etc/openresty/conf/nginx.conf -t
nginx: the configuration file /usr/local/etc/openresty/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/openresty/conf/nginx.conf test is successful
检测是成功,reload Nginx成功生效。
Nginx 申请内存的模块
可能有的不一定是openresty共享内存的锅。Nginx配置需要配置内存的地方其实不多,一个个排查就可以做到。
openresty lua_shared_dict
lua_shared_dict 定义在http模块。
声明共享内存区,共享内存区始终由当前Nginx服务器实例中的所有Nginx进程共享。
参数接受大小单位,比如K 和M 等等。
http {
lua_shared_dict dogs 10m;
...
}
proxy_cache_path
proxy_cache_path path [levels=levels] keys_zone=name:size
path 设置缓存的路径
levels 设置缓存文件的层级,当levels=1:2时,表示是两级目录,1和2表示用1位和2位16进制来命名目录名称。
keys_zone 设置共享内存的名称和大小,keys_zone=one:10m,表示共享内存名称是one,大小是10M,这里设置内存过高,就会出现开头的报警,mmap(MAP_ANON|MAP_SHARED, 314572800)
配置设置成这样
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
路径和层级就是下面的
/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
limit_req_zone
limit_req_zone key zone=name:size rate=rate
设置共享内存的限流参数
主要看下应用
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
使用客户端的IP作为限流的key,共享内存分配了10M,共享内存的名称是one,速度是每个客户端IP每秒1个请求,超过1个请求可能会延迟或者直接拒绝,要看limit_req的配置。
$binary_remote_addr变量的大小为4个字节。在64位平台上始终占据128字节。 一个1M的区域可以保留约约8000个客户端IP。所以10M大概可以准确存储8万个客户端IP。如果限流的客户端IP超过了8万个,就应该扩大共享内存。
limit_conn_zone
limit_conn_zone key zone=name:size;
设置连接数限流的参数
limit_conn_zone $binary_remote_addr zone=addr:10m;
连接数限流的参数跟请求数参数类似。
使用客户端的IP作为限流的key,共享内存分配了10M,共享内存的名称是addr。10M可以存储8万个客户端IP。限流的具体数量限制是由limit_conn配置
比如
limit_conn addr 1;
就表示每个客户端IP同时只能有一个连接存在。
总结Nginx mmap
所以,如果以后遇到关于Nginx mmap(MAP_ANON|MAP_SHARED, 314572800)报错,首先应该检查可能分配大内存的配置,首要检查的就是这两个
lua_shared_dict
proxy_cache_path
修改这两个参数就可以解决问题。
一般
limit_req_zone
limit_conn_zone
分配的内存很小,至多几十M,不会直接导致系统没有内存可分配。
关于Nginx mmap(MAP_ANON|MAP_SHARED, 314572800)报错的更多相关文章
- 备份了一个nginx的虚拟主机配置文件报错
[root@localhost vhost]# service nginx restart 停止 nginx:[确定] 正在启动 nginx:nginx: [warn] conflicting ser ...
- CentOS 下 安装 nginx 执行配置命令 ./configure 报错
CentOS 下 安装 nginx 执行配置命令 ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx 时提示以下错误: checkin ...
- php+nginx环境下的php报错设置
修改php.ini的配置: display_errors = Off(关闭) display_errors = On(开启) 设置修改完成后重启php-cgi进程 killall -9 php-cgi ...
- Nginx集群配置启动报错
- nginx重启报错:nginx: [error] invalid PID number "" in "/run/nginx.pid"
问题描述:执行 nginx -t 是OK的,然而在执行 nginx -s reload 的时候报错 nginx: [error] invalid PID number “” in “/run/ngin ...
- nginx报错 too many open files in system
系统进不去了,用ssh连接服务器也非常慢,负载均衡显示后端连接异常,重启mysql数据库,发现经常重启,或者直接关机,访问页面也访问不到. http://www.51testing.com/html/ ...
- Centos7.5中Nginx报错:nginx: [error] invalid PID number "" in "/run/nginx.pid" 解决方法
服务器重启之后,执行 nginx -t 是OK的,然而在执行 nginx -s reload 的时候报错 nginx: [error] invalid PID number "" ...
- nginx 启动报错“var/run/nginx/nginx.pid" no such file or directory
nginx 启动报错“var/run/nginx/nginx.pid" no such file or directory 今天刚搭建的nginx服务器启动时,报错“var/run/ngin ...
- linux系统报错日志学习
linux本身会自动记录系统报错日志:/var/log/messages 这个日志记录,我是在什么时候发现其强大的作用的呢?它有点像我们使用php脚本开发接口的时候技术员在重要地方打日志的效果,方便技 ...
随机推荐
- ALGEBRA-2 有限维向量空间
关键词:张成.线性无关.基.维度 linear span: V中任意一组向量的span都是V的子空间(对加法和数乘封闭) linear independent 线性无关 https://www.zy ...
- printf函数和putchar函数
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib. ...
- 【面经】超硬核面经,已拿蚂蚁金服Offer!!
写在前面 很多小伙伴都反馈说,现在的工作不好找呀,也不敢跳槽,在原来的岗位上也是战战兢兢!其实,究其根本原因,还是自己技术不过关,如果你技术真的很硬核,怕啥?想去哪去哪呗!这不,我的一个读者去面试了蚂 ...
- 【NOI2005】瑰丽华尔兹 - DP
题目描述 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意? 众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在大海上,他的 ...
- Java引用类型之弱引用与幻像引用
这一篇将介绍弱引用和幻像引用. 1.WeakReference WeakReference也就是弱引用,弱引用和软引用类似,它是用来描述"非必须"的对象的,它的强度比软引用要更弱一 ...
- unity探索者之支付宝支付,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8405044.html 支付宝的sdk接入方式和微信支付比较类似,大部分的工作也基本 ...
- 哲思集-转载自CSDN
CSDN 创始人蒋涛:世界被编码之后 分享赚¥9.90订阅博主 “写代码 20 年,通过网络平台和社区,帮助中国的程序员更好成长,这是我最希望被大家记住的.”这是蒋涛接受 ZAKER 采访的开场白. ...
- Ubutun重启网卡
一.network利用root帐户# service networking restart 或者/etc/init.d/networking restart 二.ifdown/ifup# ifdown ...
- Java 添加条码、二维码到PDF文档
本文介绍如何通过Java程序在PDF文档中添加条码和二维码.创建条码时,可创建多种不同类型的条码,包括Codebar.Code11.Code128A.Code128B.Code32.Code39.Co ...
- openvswitch 监听端口变化
命令: ovsdb-client monitor Interface name,ofport,external_ids --format=json 运行效果: [root@ostack1 ~]# ov ...