Nodejs mkdirP 模組導致CPU佔用高的問題
Nodejs mkdirP 模組導致CPU佔用高的問題
近期將nodejs專案部署到伺服器上並啟動時,發現node程式的cpu佔用率在40%左右,當時表示非常不解,剛啟動的服務並沒有執行什麼需要大量消耗cpu的邏輯,且此時還未有請求傳送到伺服器端。
鑑於這種情況,只能猜測是某段程式在初始化一些東西的時候異常,所以才導致了這種情況。
經過對程式碼的排查後,最終鎖定出為題的程式碼塊如下:
router.use(multer({
dest: config.uploadDir,
limits:{
fileSize : config.fileSizeLimit, //bytes , == 50M
files : 1
},
rename:function(fieldname, filename) {
return uuid.v1() + "_" + filename + "_" + Date.now();
},
onFileUploadStart: function (file) {
console.log(file.originalname + ' is starting ...');
},
onError: function (error, next) {
winston.error(error);
next(error);
}
}));
初看這段程式碼怎麼也不相信它會佔用這麼高的CPU,所以最大的嫌疑就是multer模組的初始化了,於是進入原始碼看看。
multer初始化部分原始碼:
var dest;
if (options.dest) {
dest = options.dest;
} else {
dest = os.tmpdir();
}
mkdirp(dest, function(err) { if (err) throw err; });
var rename = options.rename || function(fieldname, filename) {
var random_string = fieldname + filename + Date.now() + Math.random();
return crypto.createHash('md5').update(random_string).digest('hex');
};
這段程式碼最有嫌疑的不是mkdirP(建立目標資料夾)就是crypto的md5了,那麼一個一個排除。首先只是註釋掉mkdirP,重啟node,發現cpu基本為0了,所以能斷定問題出在mkdirP上了。
單憑這句mkdirp(dest, function(err) { if (err) throw err; });也看不出什麼東西,所以還是得繼續進入mkdirP的實現。
mkdirP在建立資料夾的原始碼中有這麼一段:
function mkdirP (p, mode, f, made) {
//此處省略幾行
fs.mkdir(p, mode, function (er) {
if (!er) {
made = made || p;
return cb(null, made);
}
switch (er.code) {
case 'ENOENT':
mkdirP(path.dirname(p), mode, function (er, made) {
if (er) cb(er, made);
else mkdirP(p, mode, cb, made);
});
break;
default:
fs.stat(p, function (er2, stat) {
if (er2 || !stat.isDirectory()) cb(er, made)
else cb(null, made);
});
break;
}
});
看到case ‘ENOENT’時就有點端倪了,在建立資料夾失敗後,又調了mkdirP,這樣如果第一次出問題了,那不就不停的嘗試建立了。如果是這樣,那麼肯定是傳入的路徑出了問題。回頭檢查config裡面的路徑時,發現路徑在部署配置的時候斜槓的方向寫反了:
config.path = 'c:\aa\aa';
正確的應該是:
config.path = 'c:\\aa\\aa';
or
config.path = 'c://aa//aa';
幾經周折終於解決了問題,nodejs的路還很長,走,吃飯去……
文章作者:forevercjl
文章原文連結:http://blog.csdn.net/ForeverCjl/article/details/45895795
轉載請註明出處。
相關文章
- Oracle10.2.0.3 fox aix 上 In memory undo latch導致高CPU佔用問題解決OracleAI
- 壞程式碼導致的效能問題大賞:CPU佔用飆到了900%!
- Java中的CPU佔用高和記憶體佔用高的問題排查Java記憶體
- Dubbo Hession反序列化導致CPU佔用飆高用例分析
- 欄位字元型別不匹配導致CPU佔用率高字元型別
- 解決伺服器 CPU 佔用 100% 導致 PHP-fpm 程式假死問題伺服器PHP
- 執行計劃變化導致CPU負載高的問題分析負載
- 【RAC】處理因ons導致CPU使用率過高的問題
- 面試問題---JAVA程式CPU佔用過高怎麼定位面試Java
- oracle_CPU佔用率高時的問題定位Oracle
- 解決new Thread().Start導致高併發CPU 100%的問題thread
- [轉帖]JFR 定位因為 SSL 導致 CPU Load 飈高的問題
- crontab導致CPU異常的問題分析及處理
- 解決WinXP中CPU佔用率過高的問題(MaxWorkitems)(轉)
- 解決Windows XP中CPU佔用率過高的問題(轉)Windows
- 解碼Redis最易被忽視的CPU和記憶體佔用高問題Redis記憶體
- Win10系統安裝中文IME導致CPU佔用率過高的解決方法Win10
- sql語句引起的CPU佔用國高SQL
- chrome佔用高cpu的原因 排查大致思路Chrome
- 小議 Thread.sleep(0) 造成 CPU佔用率高的問題thread
- 異常等待事件Resmgr:Cpu Quantum導致CPU利用率高事件
- latch 相關效能問題診斷: latch: row cache objects等待事件導致CPU負載高Object事件負載
- lazyload下特性模組匯入另一個模組導致的路由問題路由
- java應用CPU佔用率過高排查Java
- 一次FGC導致CPU飆高的排查過程GC
- 禁用software_reporter_tool.exe 解決CPU高佔用率的問題
- Mysql佔用過高CPU時的優化手段MySql優化
- cpu瓶頸 top的核心sy佔用較高
- CPU資源佔用100%怎麼辦?cpu佔用率高的解決辦法
- Windbg分析高記憶體佔用問題記憶體
- ORACLE CPU佔率高的程式Oracle
- 導致雲伺服器CPU經常跑高的原因有哪些?伺服器
- java專案cpu佔用高排查方法(chatgpt)JavaChatGPT
- 記一次使用easyexcel匯入excel導致cpu跑滿的問題Excel
- 訪問ASM的ONNN程式佔用大量CPUASM
- win10正式版cpu佔用高的解決方法_win10正式版cpu佔用高怎麼辦Win10
- 微軟Win10版本2004解決了高CPU佔用和磁碟效能問題微軟Win10
- 如何在 Linux 中找出 CPU 佔用高的程式Linux