mmap 报错解决

今天修改了一下测试环境的Nginx的nginx.conf,然后做检测的时候报了一个错误

/usr/local/bin/nginx -c /usr/local/etc/openresty/conf/nginx.conf -tnginx: [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 -mtotal        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时的两个报错

    为内部一台测试机./configure编译nginx时遇到报错,记录下来 ./configure \ --prefix=/usr/local/nginx \ 指定安装位置 --with-http_fl ...

  2. 【Nignx】 nginx启动http服务,报错 curl: (56) Recv failure: Connection reset by peer

    背景 docker 启动的nginx 服务,容器内端口80,映射到容器外8080,通过 curl -L -I http://xxxx:8080 报错 curl: (56) Recv failure: ...

  3. linux 下nginx搭建php项目访问报错502

    前言: 使用宝塔安装的php,nginx环境,因为想搭一个使用ip加端口访问的项目,所以没有使用他自带的一键搭建网站,就自己整了一下,结果项目可以跑访问html页面正常,但是访问php 报错 502 ...

  4. 为什么PHP项目运行报错502,Nginx+PHP-FPM遇到的502报错

    1 首先查看一下目前php-fpm的进程数量 ps aux |grep php-fpm |grep -v grep |grep "^www"|wc -l 将输出结果与nginx.c ...

  5. nginx+php-fpm遇到的502报错

    1 首先查看一下目前php-fpm的进程数量 ps aux |grep php-fpm |grep -v grep |grep "^www"|wc -l 将输出结果与nginx.c ...

  6. Nginx 414 Request-URI Too Large报错解决方法

    症状:前台客户端发送大量请求或发送的数据包太大的时候,nginx会报nginx 414 Request-URI Too Large错误,如下图 原因:当请求头过大时,超过large_client_he ...

  7. php curl nginx 报错,【Docker】docker,nginx,php使用curl报错?

    nginx错误日志 2020/02/12 08:44:29 [error] 7#7: *3 recv() failed (104: Connection reset by peer) while re ...

  8. php curl nginx 报错,docker,nginx,php使用curl报错?

    nginx错误日志 2020/02/12 08:44:29 [error] 7#7: *3 recv() failed (104: Connection reset by peer) while re ...

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

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

最新文章

  1. SQL操作语句之查询及删除重复记录的方法
  2. Semaphore(信号量)
  3. matlab vco,MATLAB锁相环仿真程序求解
  4. 对每个 IP 访问量实时监控。
  5. 【转】Unity3D将来时:IL2CPP(上)
  6. 如何HttpWebRequest模拟登陆,获取服务端返回Cookie以便登录请求后使用
  7. Leetcode-204 Count Primes
  8. FireFox不支持InnerText的解决方法
  9. 《编写可读代码的艺术》---变量和可读性
  10. 数据结构上机实践第四周项目7 - 多项式求和
  11. Gradle发布项目到 maven 之novoda/bintray-release(3)
  12. 植被指数-RVI、NDVI、DVIEVI、GVI、PVI、EVI
  13. 最新蓝屏代码0x0000006b完美解决方案,附文件
  14. IPv6规模部署及专项督查工作全国电视电话会议
  15. 已知空间中的三点 求三角形面积_高中数学:解三角形最值问题的四大模型
  16. Windows10如何添加五笔?
  17. Android仿朋友圈照片定点放大和滑动查看(未完待续)
  18. python中对字符串进行左、中、右对齐操作
  19. 机器学习第四课:SVM前置知识点(凸优化问题)
  20. 使用python爬取斗图网的图片

热门文章

  1. 【vue+springboot】excel模板下载、导入功能实现
  2. 相机计算坐标公式_相机位姿估计3:根据两幅图像的位姿估计结果求某点的世界坐标...
  3. 南大软院大神养成计划--CSS网页布局
  4. 常用10个Excel快捷键,提高工作效率
  5. 朝向look at和lookRotation
  6. 2022 年中回顾|一文看懂预训练模型最新进展
  7. Love for music
  8. SpringBoot 项目修改html后不需要重新启动(热部署)
  9. c++写一个函数验证哥德巴赫猜想
  10. Android 指纹识别(Touch ID)实例