0

我有一个非常简单的 RESTful 服务器,它基本上通过 mongoose 客户端从数据库添加/获取数据。该服务器是一个亚马逊微型实例,我觉得奇怪的是,检查我的服务器统计信息时,它有时会显示 50% 的 CPU 使用率峰值,并发性极低——我说的是不超过 10 个用户)。看看图片就知道了。

CPU使用率

请忽略时间,因为它是另一个时区。

我能想到的唯一问题是我没有编写正确的“node.js”回调代码。这是我的主要模型,routee 调用了哪些函数。

var _         = require('underscore'),
    mongoose  = require('mongoose'),
    sanitize  = require('validator').sanitize,
    Validator = require('validator').Validator,
    redis     = require('../models/reds'),
    v         = new Validator();

v.error = function(msg){
  return false;
};

var itemSchema = mongoose.Schema({
  adm:  { type: String },
  url:  { type: String, required: true },
  desc: { type: String, required: true, trim: true },
  tags: { type: [String] },
}, { autoIndex: false }).index({ tags: 1 });

var Male   = mongoose.model('Male', itemSchema),
    Female = mongoose.model('Female', itemSchema);

var idFromTime = function(time){
  var createId = function(int){ return mongoose.Types.ObjectId(int + '0000000000000000') };

  if(!time)
    return createId(Math.round(new Date().getTime() / 1000).toString(16));
    else return createId(time);
};

exports.getPhotos = function(options, next){
  var query,
      parameters = {},
      tags = [];

  if( v.validate(options.tags).is(/^[-\sa-z]+$/) && options.tags != 'undefined' ){
    tags = options.tags.split(' ');
    parameters['tags'] = { '$all': tags };
  }

  if(options.time && options.time.length == 8 && options.time.match(/[0-9a-f]+/))
    parameters['_id'] = { '$lt': idFromTime(options.time) };
    else parameters['_id'] = { '$lt': idFromTime() };

  if(options.female == true || options.male == false)      query = Female.find(parameters);
  else if(options.male == true || options.female == false) query = Male.find(parameters); 

  query
    .limit(29)
    .sort('-_id')
    .select('url desc')
    .exec(function(err, items) { next(err, items) });
};

exports.addPhoto = function(options, next){
  var photo,
      parameters,
      tags = [];

  if(
    options.desc != 'undefined' &&
    v.validate(options.desc).len(2, 100) &&
    v.validate(options.url).isUrl() &&
    v.validate(options.tags).is(/^[-\sa-z]+$/) ){
      tags = options.tags.split(' ');
      tags = _.compact(tags)
      tags = _.uniq(tags);

      parameters = {
        adm:  options.admin,
        url:  options.url,
        desc: options.desc,
        tags: tags,
      };
  } else {
    next(true);
    return false;
  }

  if(options.female == true || options.male == false)      photo = new Female(parameters);
  else if(options.male == true || options.female == false) photo = new Male(parameters);

  photo.save(function(err, photo){
    next(err, photo);
  });
};

exports.getComments = function(id, next){
  redis.lrange(id, 0, -1, function(err, list){
    next(err, list);
  });
};

exports.setComment = function(id, text, next){
  if(!text || 0 === text.length) {
    next(true);
  } else{
    redis.multi()
      .lpush(id, text)
      .ltrim(id, 0, 19)
      .expire(id, 2628000)
      .exec(function(err, reply){
        if(!err)
          next(false);
          else next(true);
      });
  }
}

我在服务器上也运行了 mongodb 和 redis,为了在我的网站上显示唯一的单个页面,我同时使用了 jam 和 stylus。

我的代码是否存在任何与性能相关的问题,或者我可以放心,这只是微实例的性能不如我想象的那么好?

4

0 回答 0