关于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脚本开发接口的时候技术员在重要地方打日志的效果,方便技 ...
随机推荐
- 2020-04-13:怎么在日志里排查错误,该用哪些Linux命令
能通过less命令打开文件,通过Shift+G到达文件底部,再通过?+关键字的方式来根据关键来搜索信息. 能通过grep的方式查关键字,具体用法是, grep 关键字 文件名,如果要两次在结果里查找的 ...
- Python 函数为什么会默认返回 None?
Python 有一项默认的做法,很多编程语言都没有--它的所有函数都会有一个返回值,不管你有没有写 return 语句. 本文出自"Python为什么"系列,在正式开始之前,我们就 ...
- CSS3动画旋转——(图片360°旋转)
今天在重构网页特效的时候,想着用到一个css3的旋转特效.简单来一个demo. html <div class="box"> <img src="./y ...
- 群晖系统设置链路聚合并配置静态IP的教程【江东网 JDX86.COM】
1.进入控制面板 > 网络 > 网络接口.请单击创建 > 创建 Bond 2.进入聚合配置向导,选择你想要的模式,这里有几种模式意思分别为: 自适应负载平衡: 此模式优化了 Syno ...
- 全网最通透的Java8版本特性讲解
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- Nordic52840SDK学习之定时器
Nordic 52840 SDK学习之定时器 今天开始学习52840SDK,特在此处记录学习内容,防止以后忘记,或许可以给以后的初学者提供一些帮助.如有错误,请发邮件至843036544@qq.com ...
- java 工具类Integer
Integer 是lang包下的工具类 为了更加熟悉Integer中的方法使用和理解 进行了一部分代码和原代码的总结 Intrger工具类方法: * * int parseInt(String s) ...
- neutron-server Connection pool is full, discarding connection 连接池过满
参考链接:https://zhiliao.h3c.com/Theme/details/48291 问题: -- ::33.235 WARNING requests.packages.urllib3.c ...
- 浅谈Docker(二)
Docker使用cgroup实现CPU,内存和磁盘IO等系统资源的限制. CPU Docker现在有2个与CPU资源相关的参数,-c可以指定CPU的占比,--cpuset可以绑定CPU.例如,指定容器 ...
- Shell编程—gawk进阶
1使用变量 awk编程语言支持两种不同类型的变量: 内建变量 自定义变量 1.1内建变量 1. 字段和记录分隔符变量 数据字段变量允许你使用美元符号($)和字段在该记录中的位置值来引用记录对应的字段. ...