gpt4 book ai didi

javascript - 正常运行 6 小时后,Redis 使用 100% CPU

转载 作者:太空宇宙 更新时间:2023-11-03 23:11:49 25 4
gpt4 key购买 nike

enter image description here

如上图所示,Redis 在运行很长一段时间后遇到了性能问题;特别是,6 小时。

我正在使用 Redis 来缓存来自 API 的响应,这样我就不必在每个请求上重新获取数十行,而且我想 - 嘿,这应该可行。显然不是。

module.exports = (app, csrfProtection, jsonParser) => {
app.get("/api/steam/getPlayerSummaries", [steamRateLimits.getPlayerSummaries, jsonParser, csrfProtection], async(req, res) => {
redisClient.hmget("steam_user", req.query.steamids, (err, reply) => {
if(err) return res.status(500).send({ message: `Could not read from Redis with error ${err}`});

redisClient.hmget(`steam_user_expires_${req.query.steamids}`, "expires", (err, expire) => {
if(err) return res.status(500).send({ message: `Could not read from Redis with error ${err}`});

if(reply[0] && (CURRENT_UNIX_TIME - expire < REDIS_EXPIRE_LIMIT)) return res.status(200).send(JSON.parse(reply));

const queryParams = querystring.stringify({
key: process.env.STEAM_API_KEY,
steamids: req.query.steamids
}),
options = {
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
};

http.get(`http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?${queryParams}`, options, response => {
const { statusCode } = response;

if(statusCode != 200) {
response.resume();
return res.status(statusCode).send({ message: `Could not fetch Steam API getPlayerSummaries with status code ${statusCode}`});
}

response.setEncoding("utf8");
let rawData = "";

response.on("data", chunk => rawData += chunk);
response.on("end", _ => {
try {
const parsedData = JSON.parse(rawData);

redisClient.hmset(["steam_user", req.query.steamids, rawData]);
redisClient.hmset([`steam_user_expires_${req.query.steamids}`, "expires", CURRENT_UNIX_TIME]);

return res.status(200).send(parsedData);
} catch (e) {
console.error(e.message);
}
});
}).on("error", e => {
console.error(`Got error: ${e.message}`);
return res.status(500).send(e);
});
});
});
});
}

以下是用户尝试访问此路由时按时间顺序发生的情况的进度概述:

  1. 用户加载索引(默认)网页。这个页面可以有20多个需要从远程 API 运行 20 个 API 查询的行(其中之一)我缓存这个的原因)。
  2. 检查用户是否已缓存在redis中
  3. 检查该 Steam 用户是否存在过期 key (即使不存在)。
  4. 如果缓存存在并且在不到 15 分钟前获取,则显示 Redis 缓存的结果。
  5. 如果缓存不存在,我们会查询远程 API。
  6. 如果请求成功,则将数据缓存到 Redis 中并返回响应。

出于某种原因,这会陷入困境,运行一段时间后,Redis 使用了如此多的 CPU 和 RAM,这太疯狂了,我认为我正在正确处理这个问题。

我还使用 shell 脚本和 crontab 每天清除一次所有缓存。

redis-cli KEYS "steam_user*" | xargs redis-cli DEL

为什么它继续消耗更多的 CPU 和 RAM(即使实际上没有访问者,我害怕想象如果有很多访问者会发生什么),以及如何解决这个问题来解决它?

最佳答案

正在使用所有资源的进程是/tmp/kdevtmpfsi。谷歌快速搜索表明它正在挖掘恶意软件。这意味着 Redis 和您的程序都没有出现某种错误。 This Github 上的评论解释了如何摆脱它。

关于javascript - 正常运行 6 小时后,Redis 使用 100% CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60308497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com