【发布时间】:2021-03-13 07:34:43
【问题描述】:
我有来自不同 GPS 跟踪器设备的数据。它是一个单向数据,这意味着我正在接收数据并将其推送到 MySQL DB 和 firebase。我总共连接了 300 台设备,它们每 10 秒向我的服务器发送数据。
我的服务器规格是
AWS t2.xlarge
CPU: 4
Ram: 16GB
发生的情况是 3 天后,它停止将数据发送到数据库。它不会停止服务器。它只是冻结。如果我这样做
sudo netstat -tulnap | grep :8050
它确实显示了过程和所有内容,但我没有看到任何数据推送到数据库中。它只是冻结。我必须重新启动服务器,否则我必须永远停止使用它并重新启动它
forever stop --minUptime 36000000000 server.js
当我转到我的PHPMyAdmin 并检查监视器屏幕时,我可以看到我的可用内存非常少,并且缓存内存为 GB。似乎所有内存都进入了缓存内存,这让我的服务器冻结了。我不知道我在哪里做错了导致它冻结。例如,在我发布问题时,这是我的服务器当前状态
正如您在上面看到的,在 19 小时内,缓存已经增加并且还在不断增长。下面是代码
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('death', function(worker) {
// console.log('worker ' + worker.pid + ' died');
cluster.fork();
});
} else {
net.createServer(function(socket) {
// console.log('received connection...');
socket.on("error", function(err) {
// console.log("socket error: ")
// console.log(err.stack);
socket.destroy();
});
socket.on('data', function(data) {
});
});
}
最近我对代码进行了一次更改,但仍然没有成功,即每 5 秒接收一次数据后关闭套接字
socket.on('data', function(data) {
//parse data and push data into db and firebase
socket.end();
});
这就是我做 MySQL 查询的方式
database.js
var mysql = require('mysql');
var pool = mysql.createPool({
connectionLimit : 8,
waitForConnections : true,
queueLimit : 300,
host : 'localhost',
user : 'username',
password : '123456',
database : 'dummy'
});
module.exports = pool;
Server.js 文件(仅我粘贴为完整代码的数据库代码有 1400 行代码)
const db = require('./database');
function getCarDetails(car_id,callback) {
db.getConnection((err, connection) => {
if(err) throw err;
console.log('connected as id ' + connection.threadId);
let selectQuery = 'SELECT * FROM ?? join user_info ON car.user_id = user_info.user_id WHERE ?? = ?';
let query = mysql.format(selectQuery, ["car", "id", car_id]);
// query = SELECT * FROM `todo` where `user` = 'shahid'
connection.query(query, (err, data) => {
connection.release();
if(err) {
console.error(err);
//throw err;
return;
}
// rows fetch
if(data.length > 0){
return callback(data[0]);
}else{
return callback(false);
}
});
});
}
function updateIgnitionNotification(car_id,acc_on,acc_off,acc,speed,updated,callback) {
db.getConnection((err, connection) => {
let updateQuery = 'UPDATE car SET notification_acc_on = ?,notification_acc_off = ?,acc = ?,speed = ?,updated = ? Where id = ?';
let query = mysql.format(updateQuery, [acc_on, acc_off,acc,speed,updated, car_id]);
// query = UPDATE `todo` SET `notes`='Hello' WHERE `name`='shahid'
connection.query(query, (err, data) => {
connection.release();
if(err) {
console.error(err);
//throw err;
return;
}else{
return callback(data);
}
});
});
}
function updateLastUpdatedData(car_id,current_datetime,status,acc,monitoring,max_speed,callback){
db.getConnection((err, connection) => {
let updateQuery = 'UPDATE car SET updated = ?,status = ?,acc = ?,monitoring = ?, max_speed = ? Where id = ?';
let query = mysql.format(updateQuery, [current_datetime,status,acc.toUpperCase(),monitoring, max_speed, car_id]);
// query = UPDATE `todo` SET `notes`='Hello' WHERE `name`='shahid'
connection.query(query, (err, data) => {
connection.release();
if(err) {
console.error(err);
//throw err;
return;
}else{
return callback(data);
}
});
});
}
function updateCommand(car_id,command,callback){
db.getConnection((err, connection) => {
let updateQuery = 'UPDATE car SET command = ? Where id = ?';
let query = mysql.format(updateQuery, [command, car_id]);
// query = UPDATE `todo` SET `notes`='Hello' WHERE `name`='shahid'
connection.query(query, (err, data) => {
connection.release();
if(err) {
console.error(err);
//throw err;
return;
}else{
return callback(data);
}
});
});
}
function updateCarLockNotification(car_id,lock_notification,callback){
db.getConnection((err, connection) => {
let updateQuery = 'UPDATE car SET lock_notification = ? Where id = ?';
let query = mysql.format(updateQuery, [lock_notification, car_id]);
// query = UPDATE `todo` SET `notes`='Hello' WHERE `name`='shahid'
connection.query(query, (err, data) => {
connection.release();
if(err) {
console.error(err);
//throw err;
return;
}else{
return callback(data);
}
});
});
}
function updateOverSpeedNotification(car_id,notification_over_speed,callback){
db.getConnection((err, connection) => {
let updateQuery = 'UPDATE car SET notification_over_speed = ? Where id = ?';
let query = mysql.format(updateQuery, [notification_over_speed, car_id]);
// query = UPDATE `todo` SET `notes`='Hello' WHERE `name`='shahid'
connection.query(query, (err, data) => {
connection.release();
if(err) {
console.error(err);
//throw err;
return;
}else{
return callback(data);
}
});
});
}
function updateGeoFenceOutsideAttempt(car_id,geofence_attempt,callback){
db.getConnection((err, connection) => {
let updateQuery = 'UPDATE car SET geofence_outside_attempt = ? Where id = ?';
let query = mysql.format(updateQuery, [geofence_attempt, car_id]);
// query = UPDATE `todo` SET `notes`='Hello' WHERE `name`='shahid'
connection.query(query, (err, data) => {
connection.release();
if(err) {
console.error(err);
//throw err;
return;
}else{
return callback(data);
}
});
});
}
function updateGeoFenceInsideAttempt(car_id,geofence_attempt,callback){
db.getConnection((err, connection) => {
let updateQuery = 'UPDATE car SET geofence_inside_attempt = ? Where id = ?';
let query = mysql.format(updateQuery, [geofence_attempt, car_id]);
// query = UPDATE `todo` SET `notes`='Hello' WHERE `name`='shahid'
connection.query(query, (err, data) => {
connection.release();
if(err) {
console.error(err);
//throw err;
return;
}else{
return callback(data);
}
});
});
}
function updateBatteryNotification(car_id,battery,callback){
db.getConnection((err, connection) => {
let updateQuery = 'UPDATE car SET notification_battery = ? Where id = ?';
let query = mysql.format(updateQuery, [battery, car_id]);
// query = UPDATE `todo` SET `notes`='Hello' WHERE `name`='shahid'
connection.query(query, (err, data) => {
connection.release();
if(err) {
console.error(err);
//throw err;
return;
}else{
return callback(data);
}
});
});
}
function saveNotificationLog(log,callback){
db.getConnection((err, connection) => {
// let insertQuery = 'INSERT INTO ?? (??,??) VALUES (?,?)';
//let query = mysql.format(insertQuery,["log","user","notes",data.user,data.value]);
// query = UPDATE `todo` SET `notes`='Hello' WHERE `name`='shahid'
connection.query('INSERT INTO log SET ?', log, (err, res) => {
connection.release();
if(err) {
return callback(res);
}else{
return callback(res);
}
});
});
}
function saveHistory(history,callback){
db.getConnection((err, connection) => {
// let insertQuery = 'INSERT INTO ?? (??,??) VALUES (?,?)';
//let query = mysql.format(insertQuery,["log","user","notes",data.user,data.value]);
// query = UPDATE `todo` SET `notes`='Hello' WHERE `name`='shahid'
connection.query('INSERT INTO car_history SET ?', history, (err, res) => {
connection.release();
if(err) {
return callback(res);
}else{
return callback(res);
}
});
});
}
function updateGeoFenceNotification(car_id,notification_inside,notification_outside,callback){
db.getConnection((err, connection) => {
let updateQuery = 'UPDATE car SET notification_inside = ?,notification_outside = ? Where id = ?';
let query = mysql.format(updateQuery, [notification_inside, notification_outside, car_id]);
// query = UPDATE `todo` SET `notes`='Hello' WHERE `name`='shahid'
connection.query(query, (err, data) => {
connection.release();
if(err) {
console.error(err);
//throw err;
return;
}else{
return callback(data);
}
});
});
}
请帮我解决这个问题
【问题讨论】:
-
是否有很多打开的套接字连接,也就是说,根据活动客户端的数量,是否比您预期的要多?您可以使用
netstat -anpot和grep检查您服务器的进程ID。尤其是处于等待状态的打开套接字连接,例如 CLOSE_WAIT。 -
请edit 向我们展示将数据从您的nodejs 程序“推送”到您的MySQL 服务器的代码。在我看来,您的 nodejs 程序建立了与 MySQL 的大量连接(几乎每小时 11,000 个)。这是很多连接流失。尝试使用connection pooling..
-
@O.Jones 我已经更新了我的问题
-
@rveerd 是的,看起来确实如此。
-
@mynameisbutt 这些连接是到数据库、到客户端还是到其他东西?什么是状态,是否有计时器?您能否编辑您的问题并添加 netstat 命令的相关输出。
标签: mysql node.js sockets nodes