Mono占用CPU100%


最近发现这个Mono + ASP.NET的环境似乎有点毛病

Mono占用CPU特别高

Google了一圈还是不知道为什么

于是从网上抄了别人写的一个脚本,每隔1分钟检测一次Mono的CPU占用,如果CPU占用过高就重启Mono

#!/bin/sh
# monitor mono cpu usage
record=0
while true;
do
cpu=$(top -b -n1 
 grep "mono" 
 head -1 
 awk \'{print $9}\')
pid=$(top -b -n1 
 grep "mono" 
 head -1 
 awk \'{print $1}\')
#cpu check
result=${cpu/.*}
if [[ $record == $pid ]];then kill -9 $pid;echo "$pid was killed";./startXingKongBeta.sh;fi
if [[ $result > 95 

 $result == 100 ]];then let record=${pid};else let record=0;fi
#echo
echo `date +%F" "%H:%M:%S`+" cpu:$result% record pid:$record pid:$pid"
sleep 60
done

服务器迁移


之前用的阿里云的服务器到期了,目前将服务器迁移到了一台新的VPS上

原来的网站是由IIS托管的ASP.Net网站

这台VPS的配置比之前的阿里云低多了,运行的是CentOS

为了将原来的网站直接迁移过来,采用了 Nginx + Mono 的方式运行

总之,恭贺新迁?

附上一篇CentOS搭建ASP.Net环境的教程

https://www.cnblogs.com/wander1129/archive/2011/12/16/mono.html

不过这篇文章中用的版本比较老了,建议自己装的时候都装最新的

JavaScript heap out of memory


这几天编译Angular工程总是编译不过,错误提示 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed – JavaScript heap out of memory

随后在Stackoverflow上找到了解决方法,现把解决方法贴出来备忘

在node_modules\\.bin下,对ng.cmd作如下修改
@IF EXIST "%~dp0\\node.exe" (
  "%~dp0\\node.exe" --max_old_space_size=8192 "%~dp0\\..\\@angular\\cli\\bin\\ng" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node --max_old_space_size=8192 "%~dp0\\..\\@angular\\cli\\bin\\ng" %*
)

对ngc.cmd作如下修改
@IF EXIST "%~dp0\\node.exe" (
  "%~dp0\\node.exe" --max_old_space_size=8192 "%~dp0\\..\\@angular\\compiler-cli\\src\\main.js" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node --max_old_space_size=8192 "%~dp0\\..\\@angular\\compiler-cli\\src\\main.js" %*
)

后记:

之后又不行了,我把.bin下的所有脚本都加上了–max_old_space_size=8192,然并卵。

后来在GitHub上看见一个回复(原文:https://github.com/angular/angular-cli/issues/5618

在%AppData%\\npm下,找到ng.cmd(Windows),然后加上–max_old_space_size=8192

问题解决。

Welcome to emergency mode!


记录一下刚刚公司服务器挂掉和恢复的经过。

背景:一台阿里云服务器用作采集数据的备份服务器,为了做一些统计,我们在本地测试环境中不断查询备份服务器的数据库,可能由于查询强度比较高,2小时后该服务器突然无响应,ssh连接失败,在阿里云的监控图表上观察到CPU使用率和网络流量突然降到0,用阿里云控制台连接上后,输入用户名之后就再无响应。至此,判断该机器已死机,直接强制重启。

症状:重启后,CentOS7提示“Welcome to emergency mode!”,错误提示信息大意为 /dev/vdb1 挂载失败。

解决方法:打开 /etc/fstab ,注释掉对阿里云数据盘 vdb1 的自动挂载。重新启动,进入正常模式,输入命令 mount /dev/vdb1 /data 重新挂载 /dev/vdb1
顺便一提,阿里云帮助中心的这篇文章还是值的收藏的

好像被DDoS攻击了


2月27日早上7点左右,我的服务器CPU使用率爆表,Web服务无法访问,强制重启后又观察了一段时间,但是并没有发现什么异常。

2月28日上午8点左右,CPU再次爆表,但是我是到3月1日上午才发现的,赶紧强制重启,同样的,再次观察了一段时间,没有发现异常。

今天我看到这样一篇新闻《全球正遭受首个核弹级DDoS攻击,多个云服务器受到影响》

文中提到了这次工具是利用了Memcache的漏洞。然而!我的服务器上就装了Memcache!难道说?!

总之我暂时把Memcache关闭了

XingKongHttpServer-简单的Http服务器

Github项目地址: https://github.com/xingkongsync/xingkonghttpserver

示例/Usage

Step 1.

首先需要创建一个请求处理器类,并继承于HttpRequestHandlerBase,其中的Path为请求路径,Handler方法用于处理Http请求。

Firstly you need to create a request handler which is the subclass of HttpRequestHandlerBase.

namespace Demo.Controller 
{
public class Home : HttpRequestHandlerBase
{
public Home()
{
Path = "/";
}
public override void Handler(HttpListenerRequest request, HttpListenerResponse response)
{
string html = "<html><head><title>Welcome</title></head><body>Welcome to XingKongHttpServer</body></html>";
//Content-Type: text/html
Html(response, html);
}
}
}

Step 2.

然后在你的主程序中创建该对象的实例,添加进HttpServer的路由中。

Create a instance of the class then add to the routher of the HttpServer.

namespace Demo 
{
class Program
{
static void Main(string[] args)
{
int port = 8080;
HttpServer httpServer = new HttpServer(port);
httpServer.AddPath(new Home());
httpServer.Start();
Console.ReadLine();
httpServer.Stop();
}
}
}

Step 3.

至此,一个最简单的Http服务器已经搭建完成,编译并运行该程序,在浏览器中访问 http://localhost:8080 即可看到效果

注意:需要管理员权限运行。

OK, everthing is done, you can run the program and type “http://localhost:8080” on your browser, see what will happen.

Attention: Administrator privilege is required.

Other

另外,推荐将所有的请求处理器放入某个命名空间下,例如:“Demo.Controller”,然后在主程序中采用如下写法,即可自动加载该命名空间下的全部请求处理器。

By the way, I recommand to put all of your request handlers in a namespace such as “Demo.Controller”, then you can write your code like this, the HttpServer will load all request handler automatically.

namespace Demo 
{
class Program
{
static void Main(string[] args)
{
int port = 8080;
HttpServer httpServer = new HttpServer(port);
httpServer.LoadController(typeof(Program), "Demo.Controller");
httpServer.Start();
Console.ReadLine();
httpServer.Stop();
}
}
}

手机消息推送测试

利用IFTTT的WebHooks写了个推送功能

另外还加上了一个“发送中”的提示框

朝我手机上发一条消息试试(已失效)

通过WebHooks实现手机消息推送


继续研究了一下IFTTT,发现其实可以不用RSS来实现推送的,还有个更好的方法
就是利用IFTTT的WebHooks服务,WebHooks服务可以使用一个HTTP POST或GET方法作为一个触发器,并使用POST或GET方法作为动作

这里我们主要是使用WebHooks的触发器功能

1、首先打开http://ifttt.com/maker,确保你的WebHooks服务是可以用的
2、点击 My Applets,点击New Applet
3、if this then that, this选择WebHooks,Trigger选择Receive a web request,Event Name填一个有意义的,如push
4、if this then that, that选择Notification,参数填Value1 : Value2
5、最后不要忘记保存

创建完Applet之后回到http://ifttt.com/maker,在{event}出填入你的刚刚写的Event Name,然后把URL复制出来,
这个就是你的推送URL了,然后把Value1作为标题,Value2作为正文,使用一个POST请求就可以触发推送了

这种实现推送的方法相比之前的RSS方法,速度会很快,因为通过RSS实现推送其实是IFTTT通过轮询RSS接口来判断是否有新内容的
通常需要5分多钟才能收到推送

而通过WebHooks的方法速度无疑肯定最快,而且编程也简单,但是相比与RSS的方式,缺点就是不能像RSS那样,对每条推送设置一个URL
这样就仅仅是纯推送了,用户点击了并不会有任何跳转,不如RSS灵活。

大失误的后续

刚刚把数据库备份一份到了本地

大失误!


我tm刚刚改数据库手贱
把好多记录覆盖掉了我日

有tm近一半的博客日志蒸发了!!!

很气!

然后……凭借着以前的截图和记忆力把大部分失去的数据都补回来了  Orz

总结一下:珍爱生命,远离手动改库