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)报错的更多相关文章

  1. 备份了一个nginx的虚拟主机配置文件报错

    [root@localhost vhost]# service nginx restart 停止 nginx:[确定] 正在启动 nginx:nginx: [warn] conflicting ser ...

  2. CentOS 下 安装 nginx 执行配置命令 ./configure 报错

    CentOS 下 安装 nginx 执行配置命令 ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx 时提示以下错误: checkin ...

  3. php+nginx环境下的php报错设置

    修改php.ini的配置: display_errors = Off(关闭) display_errors = On(开启) 设置修改完成后重启php-cgi进程 killall -9 php-cgi ...

  4. Nginx集群配置启动报错

  5. nginx重启报错:nginx: [error] invalid PID number "" in "/run/nginx.pid"

    问题描述:执行 nginx -t 是OK的,然而在执行 nginx -s reload 的时候报错 nginx: [error] invalid PID number “” in “/run/ngin ...

  6. nginx报错 too many open files in system

    系统进不去了,用ssh连接服务器也非常慢,负载均衡显示后端连接异常,重启mysql数据库,发现经常重启,或者直接关机,访问页面也访问不到. http://www.51testing.com/html/ ...

  7. Centos7.5中Nginx报错:nginx: [error] invalid PID number "" in "/run/nginx.pid" 解决方法

    服务器重启之后,执行 nginx -t 是OK的,然而在执行 nginx -s reload 的时候报错 nginx: [error] invalid PID number "" ...

  8. 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 ...

  9. linux系统报错日志学习

    linux本身会自动记录系统报错日志:/var/log/messages 这个日志记录,我是在什么时候发现其强大的作用的呢?它有点像我们使用php脚本开发接口的时候技术员在重要地方打日志的效果,方便技 ...

随机推荐

  1. Android Studio Gradle build 报错:Received status code 400 from server: Bad Request

    错误提示如下 Could not GET 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/ ...

  2. ESLint 使用简介

    C 语言诞生之初,程序员编写的代码风格各异,在移植时会出现一些因为不严谨的代码段导致无法被编译器执行的问题.于是在 1979 年,一款叫 lint[1] 的程序被开发出来,能够通过扫描源代码检测潜在的 ...

  3. Mybatis-05-使用注解开发

    使用注解开发 1 面向接口编程 原因: 解耦.可扩展性.提高复用性 关于接口的理解 定义与实现的分离 两类接口 一个个体的抽象,abstract class 一个个体某个方面的抽象,interface ...

  4. 使用部分函数时并未include其所在头文件,但是能编译成功且能运行,为什么?

    最近在看APUE,试了上面的一些例子,其中有个例子是使用getpid函数获取进程id,但是在我写demo时,并未引入其所在的头文件unistd.h,结果也能编译成功,也能运行,于是就琢磨下为啥. En ...

  5. unity探索者之微信分享回调

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7574561.html 上一遍讲了微信分享的一些坑,然后就忘了回调这事儿了,今天补上 ...

  6. Pytools1.0.0发布啦!

    大家赶紧来看看,特别好用的. 文档: This is pytools modulethe module is use MIT license MIT License Copyright (c) 202 ...

  7. netfilter demo

    功能:指定IP报文DROP #include <linux/module.h> #include <linux/kernel.h> #include <linux/net ...

  8. java安全编码指南之:基础篇

    目录 简介 java平台本身的安全性 安全第一,不要写聪明的代码 在代码设计之初就考虑安全性 避免重复的代码 限制权限 构建可信边界 封装 写文档 简介 作为一个程序员,只是写出好用的代码是不够的,我 ...

  9. [CSP-S2019]树上的数 题解

    CSP-S2 2019 D1T3 考场上写了2h还是爆零……思维题还是写不来啊 思路分析 最开始可以想到最简单的贪心,从小到大枚举每个数字将其移动到最小的节点.但是通过分析样例后可以发现,一个数字在移 ...

  10. JavaScript函数的高级用法

    1.函数的定义和调用 1.1函数的定义方式 方式1 函数声明方式 function 关键字 (命名函数) function fn(){} 方式2 函数表达式(匿名函数) var fn = functi ...