最近装个centos 7.6的环境,其中,基础环境包括,redis、nginx、mongodb、fastdfs、mysql等,其中,自启动使用的是systemctl,其余几个组件,都没啥问题,惟独,这个mongodb,是死活启动不了。html
可是,我这里说的,不是启动不了,若是直接在shell里敲:java
systemctl start mongod.service
是没啥问题的,是能够启动的。mysql
mongod.service大体以下,各文件夹的权限也已经仔细检查过,应该是没毛病:nginx
[Unit] Description=High-performance, schema-free document-oriented database After=network.target Documentation=https://docs.mongodb.org/manual [Service] User=mongod Group=mongod Environment="OPTIONS=-f /etc/mongod.conf" ExecStart=/usr/bin/mongod $OPTIONS ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb PermissionsStartOnly=true PIDFile=/var/run/mongodb/mongod.pid Type=forking # file size LimitFSIZE=infinity # cpu time LimitCPU=infinity # virtual memory size LimitAS=infinity # open files LimitNOFILE=64000 # processes/threads LimitNPROC=64000 # locked memory LimitMEMLOCK=infinity # total threads (user+kernel) TasksMax=infinity TasksAccounting=false # Recommended limits for for mongod as specified in # http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings [Install] WantedBy=multi-user.target
后边换成了rc.local方式:redis
/etc/rc.d/rc.local #!/bin/bash /usr/bin/mongod --fork -f /etc/mongod.conf &
可是,依然不行。sql
这两天,同事也在断断续续在弄,你们手里有其余事,这块暂时放下了。mongodb
我通常浏览器开的tab比较多,有个几天前的tab,是关于strace的,我当时主要是想:找一个命令,能够监控某个进程的网络请求。shell
原本能够用tcpdump,可是,这个不是针对某个进程的,只能经过端口过滤,通常状况下,用端口过滤也足够了,可是,老是以为不爽。ubuntu
而后找到了这个连接:centos
https://askubuntu.com/questions/11709/how-can-i-capture-network-traffic-of-a-single-process
里面提到了strace能够作到。试了下,确实完美解决了个人问题。
好比说,我能够attach到某个进程,而后调用进程的某个接口,让该进程调用某个微服务,而后看看咱们能不能抓到:
(看不清可在单独tab查看,这个是java应用,向注册中心eureka发送的心跳,能够发现,完美抓到了)
可参考个人这篇简单介绍:
Linux下,如何监控某个进程到底向哪一个地址发起了网络调用
你们也能够直接在服务器上直接执行如下shell,查看帮助文档:
yum install strace man strace
其主要支持两种方式,一种是直接使用strace来包装某个命令,使用strace来启动该命令;另外一种,就是上面说的,attach到某个已经在运行中的进程。
而后,我想到,既然strace能够监控系统调用,那么,监控下mongodb吧,这里能够用strace来包装命令,我试着把命令换成了以下的样子:
strace -tt -s 10000 -o mongo.txt /usr/bin/mongod --fork -f /etc/mongod.conf
这块命令,分两块看。
strace -tt -s 10000 -o mongo.txt
这部分是strace的参数,
-tt 打印时间
-s 设置字符串的长度,不然具体内容显示不出来
-o 将结果输出到文件
另外部分,就是mongo的命令了:
/usr/bin/mongod --fork /etc/mongod.conf
在同事建议下,咱们先直接在shell中执行了如下命令:
strace -tt -s 10000 -o mongo.txt /usr/bin/mongod --fork -f /etc/mongod.conf
而后,获得了mongo.txt。这个是正常的文件。
而后,咱们reboot了服务器,而后不清楚文件生成到哪里了,直接find查找了一把,而后找到后,把这两个文件,都存到了pc上,用beyond compare进行对比。
下面是对比结果:
建议大图查看。
能够发现,有问题的文件里,在打开如下文件时,报了错,提示没有权限:
/sys/fs/cgroup/memory/memory.limit_in_bytes EACCES (Permission denied)
而后,咱们只是知道了,有这个现象,但不知道为啥,而后就开始了一顿漫无边际的面向搜索引擎找问题。找了半天,没啥收获。
后边咱们就决定再去看看官网,看看官网有没有说,怎么才是正统的服务自启动方式(已经快放弃了。。。)
结果在官网的以下连接:
看到以下一段话,说SELinux,默认不让mongo访问/sys/fs/cgroup:
而后我一看,这个目录有点熟悉啊,上面报没有权限的文件,不就这个目录下吗?
/sys/fs/cgroup/memory/memory.limit_in_bytes EACCES (Permission denied)
知道缘由就好说了,原来是SELinux,咱们这边比较暴力,直接把这个关闭了。
关闭方式:http://www.javashuo.com/article/p-vnqrmbin-eh.html
在华为的时候,组里的大佬们有一句话:办法总比困难多。
那时感受,这也太鸡汤了。。。
我如今也有这个感受,每次在快要放弃时,问题结果被解决了,有点意思。
另一个感悟:方法比结果重要