最近裝個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
在華爲的時候,組裏的大佬們有一句話:辦法總比困難多。
那時感受,這也太雞湯了。。。
我如今也有這個感受,每次在快要放棄時,問題結果被解決了,有點意思。
另一個感悟:方法比結果重要