GVKun编程网logo

NodeJs + Knex + MySql + WSL 2以非常慢的性能使磁盘100%运行(nodejs缓存数据)

21

最近很多小伙伴都在问NodeJs+Knex+MySql+WSL2以非常慢的性能使磁盘100%运行和nodejs缓存数据这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展1.2Node

最近很多小伙伴都在问NodeJs + Knex + MySql + WSL 2以非常慢的性能使磁盘100%运行nodejs缓存数据这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展1.2 Node.js 安装与使用-基础配置-NodeJs+Express+Mysql实战、1.3 Mysql 安装与使用-基础配置-NodeJs+Express+Mysql实战、2 Node.js 知识点讲解-NodeJs+Express+Mysql实战、4.2 数据库表/Sequelize Mysql-博客后端Api-NodeJs+Express+Mysql实战等相关知识,下面开始了哦!

本文目录一览:

NodeJs + Knex + MySql + WSL 2以非常慢的性能使磁盘100%运行(nodejs缓存数据)

NodeJs + Knex + MySql + WSL 2以非常慢的性能使磁盘100%运行(nodejs缓存数据)

如何解决NodeJs + Knex + MySql + WSL 2以非常慢的性能使磁盘100%运行?

我有一台Razer Blade 15笔记本电脑,它运行带有knex库的NodeJ,以通过在WSL 2 VM中分配来访问MysqL数据库。

这是第二次出现相同的问题,第一个,我发现的唯一解决方案(我自己)是将Windows 10重新安装到结构状态。

我遇到的问题是,当我执行迁移(创建和更改数据库结构,如表,索引等)时,它们的运行速度非常慢。他们过去通常在不到1分钟的时间内执行,而现在却需要20分钟左右,而我什么也没做。奇怪的是,当我执行它们时,我的磁盘容量达到100%,但运行速度极慢,就像下图所示:

磁盘速度为100%,但系统(似乎代表数据库调用)以1MB / s的速度运行,此时它可以升至100MB / s,而不会出现问题。 Check here

所有其他常见应用程序都可以正常运行,因此磁盘不是问题。我尝试重新安装MysqL,重新安装WSL,将PC恢复到以前的日期,但仍然遇到相同的问题。经过1周的尝试,我最后一次找到的唯一解决方案是完全重新安装操作系统。

我没有使用已安装的磁盘。一切都在WSL2 VM上运行。

请告诉我是否有需要帮助的信息,我会发送。

更新21/10/20 我尝试在新的磁盘分区中安装Ubuntu 20.04。令我惊讶的是,我遇到了与Windows中相同的问题。

请求的技术数据: 磁盘:Liteon ca5-8d512 NvMe SSD 内存:16G 处理器:Intel Core i7-10750H,6核,12线程

[Innodb指标] [https://pastebin.com/Sx5FqiLi]

显示完整的程序列表;

See report

IO任务

See report

任务

See report

[https://pastebin.com/7X1TRrEw] [全局变量]

在Ubuntu 20.04上,我的进程未完成并显示此错误:

Error: Error while executing "/home/nicolas/SystemOne/Repositories/aspect/api/seeds/development/04_myanmar.js" seed: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
    at Seeder._waterfallBatch (/home/nicolas/SystemOne/Repositories/aspect/api/node_modules/knex/lib/seed/Seeder.js:118:23)
KnexTimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
    at Client_MysqL.acquireConnection (/home/nicolas/SystemOne/Repositories/aspect/api/node_modules/knex/lib/client.js:349:26)
    at runNextTicks (internal/process/task_queues.js:54:5)
    at listOnTimeout (internal/timers.js:501:9)
    at processtimers (internal/timers.js:475:7)

我还进行了手动压力测试,多次调用INSERT,将行插入到简单表中,仅将值添加到1列。每个INSERT执行大约需要0.1秒。然后,选择所有行(如730)需要0.00036秒,因此我的结论是,最大的问题是插入或模式更改。

See report

谢谢:)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

1.2 Node.js 安装与使用-基础配置-NodeJs+Express+Mysql实战

1.2 Node.js 安装与使用-基础配置-NodeJs+Express+Mysql实战

下面介绍三种安装方式,各位根据需求选择

· Node.js 的安装与使用 【荐】

· 快速搭建 Node.js 开发环境以及加速 npm【多系统】

基于brew安装Node.js【Mac】

安装Node

brew install node

安装成功后 检查安装是否成功

node -v

clipboard.png

由于国外的npm源很不稳定需要讲起转为 国内淘宝npm源,如果需要管理员权限那么 加sudo
npm install -g cnpm --registry=https://registry.npm.taobao.org

如果默认安装的nodejs版本不是项目需要的版本,那么可以通过 n(版本管理工具)来管理;

npm install -g n  //执行安装n命令
n 5.10.1 //通过n来安装node固定版本(这里的5.10.1为安装示例版本)

clipboard.png

如果提示没有权限

clipboard.png

那么请 使用管理员权限,即

sudo n 5.10.1

clipboard.png

按照上面介绍 咱们安装下项目nodejs环境版本 v8.9.3【这里说声抱歉,之前这篇教程写的比较早,现在更新为8.9.3】

n 8.9.3

如果需要切换node版本,那么

n //执行node版本列表命令

clipboard.png

“ο”为当前选中

上下切换,回车即可选中;

1.3 Mysql 安装与使用-基础配置-NodeJs+Express+Mysql实战

1.3 Mysql 安装与使用-基础配置-NodeJs+Express+Mysql实战

下载 MySQL 及安装

1、下载 MySQL 及安装

OS X Mavericks 中并没有集成 Mysql,需要手动安装。

官网下载: http://dev.mysql.com/download...

国内镜像: http://mirrors.sohu.com/mysql/

请下载 Mac OS X 10.7 (x86, 64-bit), DMG Archive (如有更新版本,可下载)。

如需要登录/注册,直接点下方的:No thanks, just start my download.

下载完DMG之后,双击你会提取出三个文件和一个 RedMe.txt 文档。这三个文件分别是:

mysql-5.6.15-osx10.7-x86_64.pkg
MySQLstartupitem.pkg
MySQL.PrefPane

你需要逐一安装这三个文件,MySQLStartupItem.pkg 安装后,mysql会随系统启动而自启动,MySQL.prefPane 表示可以在系统偏好设置中看到mysql选项,还有一个就是mysql的安装项。

2、配置及启动 MySQL

三个文件都安装完成之后,进入「系统偏好设置」,在面板的最下面你会看到一个 MySQL 的设置项,点击它之后就可以启动MySQL。

clipboard.png

也可以通过命令开启mysql:

sudo /usr/local/mysql/support-files/mysql.server start

如果你想查看 MySQL 的版本,可以用下面这个命令:

/usr/local/mysql/bin/mysql -v

运行上面这个命令之后,会直接从命令行中登录到 MySQL,输入命令 q 即可退出。

到这里 MySQL 已经配置完成,并且可以运行。

3、mysql相关命令设置

为了更加方便使用,最好再设置一下系统环境变量,也就是让 mysql 这个命令在任何路径都可以直接启动(不需要输入一长串的准确路径)。

设置环境变量也很方便,直接用命令(这里笔者用 vi 编辑器举例):

cd ;
vi .bash_profile

然后按字母 i 进入编辑模式,将下面的这句代码贴进去:

export PATH="/usr/local/mysql/bin:$PATH"

然后按 esc 退出编辑器,再输入 :wq(别忘了冒号)保存退出。当然你如果使用 nano 或者别的编辑器的话,操作方式跟这个可能不一样,反正意思就是将上面那句话写入到 .bash_profile 文件中。

接下来还要重新加载一下 Shell 以让上面的环境变量生效:

source ~/.bash_profile

之后你就可以在终端的任意目录使用 mysql 命令了,你可以运行 mysql -v 试试。

最后一步,安装好后默认的用户名是root,密码为空,你还应该给你的 MySQL 设置一个 root 用户密码,命令如下:

mysqladmin -u root password ''这里填你要设置的密码''

(请记住密码一定要用半角单引号包起来)

上面的 mysqladmin 命令,我没有写完整路径。因为上面我们已经设置了环境变量,如果你没有设置环境变量的话,就需要用/usr/local/mysql/bin/mysqladmin 来运行。

4、修复mac下 mysql.sock 路径导致的2002 socket 错误

由于 mac 下安装mysql,自动生成的 mysql.sock 路径在 /tmp/mysql.sock ,而php默认连接mysql的路径是 /var/mysql/mysql.sock ,因此需要通过如下命令来修复连接:

sudo mkdir /var/mysql
sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

当然也可通过修改 /etc/php.ini 如下行:

mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock
pdo_mysql.default_socket = /tmp/mysql.sock

上述操作也能解决 mysql 不能使用 localhost 连接的问题,由于“127.0.0.1”使用“TCP/IP”协议,“localhost”使用sock方式连接,而mac下的mysql.sock的位置/tmp/mysql.sock与phpinfo() 给出的位置/var/mysql/mysql.sock不相符。

如果登录时提示:ERROR 1045 (28000): Access denied for user ''root''@''localhost'' (using password: NO)

此时需要修改数据库密码

1、停止服务

mysql.server stop

2、进入安全模式

mysqld_safe --skip-grant-tables&

3、另起一个命令板

mysql --user=root mysql
mysql> update user set password=password("root") where user ="root";
Query OK, 2 rows affected (0.01 sec)

Rows matched: 3 Changed: 2 Warnings: 0

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> exit;

Bye

4、Now kill your running mysqld then restart it normally.

killall mysqld_safe&

5、重启服务

mysql.server start

安装mysql可视化管理工具Navicat Premium

Navicat Premium 11.2.1500 Mac中文破解版
http://www.sdifen.com/navicat...

参考阅读:

初识NodeJS服务端开发(Express+MySQL)http://www.alloyteam.com/2015...

2 Node.js 知识点讲解-NodeJs+Express+Mysql实战

2 Node.js 知识点讲解-NodeJs+Express+Mysql实战

Node.js 新手入门:Node.js 新手入门 - CNode技术社区
https://cnodejs.org/getstart

本章节主要参考 nswbmw 教程已经写的很棒了,直接将其教程地址为大家转载过来

  • Node.js 知识点讲解

    • require
    • exports 和 module.exports
    • Promise
    • 环境变量
    • packge.json

      • semver
    • npm 使用注意事项

      • npm init
      • npm install
      • npm scripts
      • npm shrinkwrap

4.2 数据库表/Sequelize Mysql-博客后端Api-NodeJs+Express+Mysql实战

4.2 数据库表/Sequelize Mysql-博客后端Api-NodeJs+Express+Mysql实战

功能梳理完了以后,咱们就可以开始数据库表设计了:

数据库表图:

clipboard.png

首先打开Navicat Premium 创建数据库 blog

配置如下:

clipboard.png

课前学习:
1、Sequelize 中文API文档【强烈推荐】
2、Sequelize 和 MySQL 对照
3、使用Sequelize
4、Sequelize API
5、关于“时间”的一次探索

在blogNodejs/models 下

首先新建 mysql.js 进行mysql连接配置(基于Sequelize)

var config = require(''config-lite'');//引入灵活配置文件
var Sequelize = require(''sequelize'');.//引入Sequelize

var Mysql = new Sequelize(config.mysql.database, config.mysql.user, config.mysql.password, {
    host: config.mysql.host, //数据库服务器ip
    dialect: ''mysql'', //数据库使用mysql
    port: 3306, //数据库服务器端口
    pool: {
        max: 5,
        min: 0,
        idle: 10000
    },
});

module.exports = Mysql;

然后根据数据库图,依次创建对应的Model

clipboard.png

这里以user.js为示例 单独说下:

/**
 * User 用户表
 */
var Sequelize = require(''sequelize'');//引入sequelize
var Mysql = require(''./mysql'');//引入mysql实例化

//定义User用户表
var User = Mysql.define(''user'', {
    uuid: {//使用uuid 而不使用
        type: Sequelize.UUID,//设置类型
        allowNull: false,//是否允许为空
        primaryKey: true,//主键
        defaultValue: Sequelize.UUIDV1,//默认值
    }, //uuid
    email: { //邮箱
        type: Sequelize.STRING,
        allowNull: false,
        unique: true, //唯一
        validate: {//设置验证条件
            isEmail: true,// 检测邮箱格式 (foo@bar.com)
        },
    },
    password: { //密码
        type: Sequelize.STRING,
        allowNull: false,
    },
    state: { //状态 0未激活邮箱、1已激活邮箱
        type: Sequelize.STRING(2),//限制字符个数
        defaultValue: "0", //默认值
    },
}, {
    freezeTableName: true, //开启自定义表名
    tableName: ''User'',//表名字
    timestamps: true, // 添加时间戳属性 (updatedAt, createdAt)
    createdAt: ''createDate'',// 将createdAt字段改个名
    updatedAt: ''updateDate'',// 将updatedAt字段改个名
    indexes: [{ // 索引
        type: ''UNIQUE'', //UNIQUE、 FULLTEXT 或 SPATIAL之一
        method: ''BTREE'', //BTREE 或 HASH
        unique: true, //唯一 //设置索引是否唯一,设置后会自动触发UNIQUE设置//true:索引列的所有值都只能出现一次,即必须唯一
        fields: [''uuid''], //建立索引的字段数组。每个字段可以是一个字段名,sequelize 对象 (如 sequelize.fn),或一个包含:attribute (字段名)、length (创建前缀字符数)、order (列排序方向)、collate (较验的字段集合 (排序))
    }],
    comment:"User Table",//数据库表描述
});

module.exports = User;//导出

表都写完后,新建index.js

**
 * 数据库表关系建立
 */
var Mysql = require(''./mysql'');

//表
var AdminUser = require(''./adminUser'');//管理员表
var User = require(''./user'');//用户表
var UserInfo = require(''./userInfo'');//用户信息表
var Article = require(''./article'');//文章表
var Category = require(''./category'');//文章类别表
var Attachment = require(''./attachment'');//文章附件表

/**
 * 关系建立
 */

//用户-用户资料
User.hasOne(UserInfo); //1:1

//用户-文章
User.hasMany(Article); //1:N
Article.belongsTo(User); //1:1

//文章-分类 (定义中间表ArticleCategory 实现多对多)
Article.belongsToMany(Category,{through: ''ArticleCategory''}); //N:N
Category.belongsToMany(Article,{through: ''ArticleCategory''}); //N:N


//基于sequelize自动创建表//【!!注意 首次执行完请注释掉该段代码 !!】
Mysql.sync({
    force: true,//是否清空数据库表
}).then(function() {
    console.log(''ok'');
});

module.exports = {
    AdminUser: AdminUser,
    User: User,
    UserInfo: UserInfo,
    Article: Article,
    Category: Category,
    Attachment: Attachment,
};

好。到这里,咱们咱们打开

blogNodejs/app.js 写入以下代码

/**
 * 主入口启动文件
 * add by wwj
 * 2017-08-24 15:01:48
 */
var express = require(''express''); //web 框架
var logger = require(''morgan''); //开发模式下log
var bodyParser = require(''body-parser''); //json
var path = require(''path''); //路径
var config = require(''config-lite''); //读取配置文件
var winston = require(''winston''); //日志
var expressWinston = require(''express-winston''); //基于 winston 的用于 express 的日志中间件
var models = require(''./models''); //临时添加 为了生成数据库表,后面写到Controllers里面

//实例化express
var app = express();

// 设置模板目录
app.set(''views'', path.join(__dirname, ''views''));
// 设置模板引擎为 ejs
app.set(''view engine'', ''ejs'');

// log
app.use(logger(''dev''));

//设置json
//格式化JSON的输出
app.set(''json spaces'', 2);
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({
  extended: false
}));
// parse application/json
app.use(bodyParser.json());

// 设置静态文件目录
app.use(express.static(path.join(__dirname, ''public''))); //注意:中间件的加载顺序很重要。如上面设置静态文件目录的中间件应该放到 routes(app) 之前加载,这样静态文件的请求就不会落到业务逻辑的路由里;

//错误请求的日志
app.use(expressWinston.errorLogger({
  transports: [
    new winston.transports.Console({
      json: true,
      colorize: true
    }),
    new winston.transports.File({
      filename: ''logs/error.log''
    })
  ]
}));

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get(''env'') === ''development'' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render(''error'');
});

//app
module.exports = app;

执行一下

npm run dev

clipboard.png

然后去mysql 下看看是否创建成功了(右击“表”-刷新)

clipboard.png

到这里,咱们的数据库已经ok啦

下面学习了解些业务逻辑写法

// 字段类型
// STRING
// CHAR
// TEXT
// INTEGER :A 32 bit integer.
// BIGINT :A 64 bit integer.
// FLOAT
// REAL
// DOUBLE
// DECIMAL
// BOOLEAN
// TIME
// DATE
// BLOB

//where
$and: {a: 5}           // AND (a = 5)
$or: [{a: 5}, {a: 6}]  // (a = 5 OR a = 6)
$gt: 6,                // > 6
$gte: 6,               // >= 6
$lt: 10,               // < 10
$lte: 10,              // <= 10
$ne: 20,               // != 20
$not: true,            // IS NOT TRUE
$between: [6, 10],     // BETWEEN 6 AND 10
$notBetween: [11, 15], // NOT BETWEEN 11 AND 15
$in: [1, 2],           // IN [1, 2]
$notIn: [1, 2],        // NOT IN [1, 2]
$like: ''%hat'',         // LIKE ''%hat''
$notLike: ''%hat''       // NOT LIKE ''%hat''
$iLike: ''%hat''         // ILIKE ''%hat'' (case insensitive) (PG only)
$notILike: ''%hat''      // NOT ILIKE ''%hat''  (PG only)
$like: { $any: [''cat'', ''hat'']}
                       // LIKE ANY ARRAY[''cat'', ''hat''] - also works for iLike and notLike
$overlap: [1, 2]       // && [1, 2] (PG array overlap operator)
$contains: [1, 2]      // @> [1, 2] (PG array contains operator)
$contained: [1, 2]     // <@ [1, 2] (PG array contained by operator)
$any: [2,3]            // ANY ARRAY[2, 3]::INTEGER (PG only)

$col: ''user.organization_id'' // = "user"."organization_id", with dialect specific column identifiers, PG in this example

{
  rank: {
    $or: {
      $lt: 1000,
      $eq: null
    }
  }
}
// rank < 1000 OR rank IS NULL

{
  createdAt: {
    $lt: new Date(),
    $gt: new Date(new Date() - 24 * 60 * 60 * 1000)
  }
}
// createdAt < [timestamp] AND createdAt > [timestamp]

{
  $or: [
    {
      title: {
        $like: ''Boat%''
      }
    },
    {
      description: {
        $like: ''%boat%''
      }
    }
  ]
}
// title LIKE ''Boat%'' OR description LIKE ''%boat%''
CURD

create

result.dataValues;

========================

update

result [1];

========================

find - 从数据库中查找一个指定元素

- findById 按已知id查找

- findOne 按属性查找

result.dataValues

========================

findOrCreate - 从数据库中查找一个指定元素如果不存在则创建记录

========================

findAndCountAll - 从数据库中查找多个元素,返回数据与记录总数

count - 整数,匹配到的总记录数
rows - 对象数据,通过 limit 和 offset匹配的当前页数据

{ count: 0, rows: [] }

findAndCountAll同样支持使用include包含,使用包含时只有将required设置为true才会添加到count部分:
User.findAndCountAll({
  include: [
     { model: Profile, required: true}
  ],
  limit: 3
});

使用include时,两个模型之间应该存在主/外键关系,如果不存在就应该在include中手工建立连接。

在上面的示例中,为Profile设置了required,所以在查询时会使用INNER JOIN内连接。
========================

findAll - 从数据库中查找多个元素

// 查询时使用字符串替换
Project.findAll({ where: ["id > ?", 25] }).then(function(projects) {
  // projects 是一个包含 Project 实例的数组,各实例的id 大于25
})
========================

count - 统计数据库中的元素数

max - 查找指定表中最大值

min - 查找指定表中最小值

sum - 对指定属性求和

========================

destroy

result

项目实战(提前了解,后面可以再学到controller那一层的时候看代码学习使用)

新增

clipboard.png

const userResult = yield User.create({
    email: email,
    password: md5(password),
    state: "1", //先默认已激活状态 //状态 0未激活邮箱、1已激活邮箱
});

更新

clipboard.png

const userResult = yield User.update(user, {
    // fields: [''trueName'', ''birth'', ''sex'', ''city'', ''address''], //设置允许更新字段白名单
    where: {
        uuid: userUuid,
    },
});

clipboard.png

yield User.update({
    password: md5(newPwd),
}, {
    // fields: [''password''], //设置允许更新字段白名单
    where: {
        uuid: userUuid,
    },
});

查询单个

clipboard.png

const userResult = yield User.findOne({
    where: {
        uuid: userUuid,
    },
});

查询全部 模糊查询、分页、排序

clipboard.png

var condition = {};
if (email) {
    condition.email = {
        ''$like'': ''%'' + email + ''%'',
    };
}
if (trueName) {
    condition.trueName = {
        ''$like'': ''%'' + trueName + ''%'',
    };
}
if(role){
    condition.role = role;
}
//分页
var page = {
    currPage: utils.handleCurrPage(params.currPage), //获取当前页
    pageSize: utils.handlePageSize(params.pageSize), //每页数量
};

const result = yield User.findAndCountAll({
    where: condition,
    attributes: {
        excludse: [''password''],
    },
    limit: page.pageSize, // 每页多少条
    offset: page.pageSize * (page.currPage - 1), // 跳过多少条
    order: [ //排序
        [''createDate'', ''DESC''],
    ]
});

延伸:事务

场景:当表A数据入库成功后再去执行建立和表B的关联关系;这时候如果其中一个环节出了问题,那么整个操作就无效,而不是执行一半,造成脏数据;

//事务处理
  return Mysql.transaction(function (t) {
    // 先执行入库
    return TableA.create(ajaxData, { transaction: t }).then(function(TableAResult){
        // 入库成功后 如果TableB数据存在 
        if(TableBResult){
            // 建立TableA与TableB的关系
            return TableAResult.setTableBs(TableBResult, { transaction: t });
        }
    });
  }).then(function () {// 事务已被提交 result 是 promise 链返回到事务回调的结果
    //success
    utils.handleJson({
      response: res,
      result: "ok",
    });
  }).catch(function(err) {
    console.log(err);
    utils.handleError({
      response: res,
      error: ''失败'',
    });
  });

关于NodeJs + Knex + MySql + WSL 2以非常慢的性能使磁盘100%运行nodejs缓存数据的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于1.2 Node.js 安装与使用-基础配置-NodeJs+Express+Mysql实战、1.3 Mysql 安装与使用-基础配置-NodeJs+Express+Mysql实战、2 Node.js 知识点讲解-NodeJs+Express+Mysql实战、4.2 数据库表/Sequelize Mysql-博客后端Api-NodeJs+Express+Mysql实战的相关信息,请在本站寻找。

本文标签:

上一篇与MySQL的连接密钥斗篷(与mysql的连接密钥斗篷怎么用)

下一篇SQL代理未在Azure容器中的Ubuntu SQL Server Docker容器上启动(sql server代理未在运行)