没有合适的资源?快使用搜索试试~ 我知道了~
谈谈最近优化一个网站项目的经验,首先说一下背景情况:1)在页面后台代码中我们把页面上大部分的HTML都使用字符串来拼接生成然后直接赋值给LiteralControl。2)网站CPU很高,基本都在80%左右,即使使用了StringBuilder来拼接字符串性能也不理想。3)为了改善性能,把整个字符串保存在memcached中,性能还是不理想。在比较了这个网站和其它网站服务器上相关性能监视器指标后发现有一个参数特别显眼:就是其中的每秒分配字节数,这个性能比较差的网站每秒分配2GB的内存(而且需要注意由于性能监视器是每秒更新一下,对于一个非常健康的网站这个值应该经常看到是0才对)!而其它一些网站只分
资源详情
资源评论
资源推荐
项目优化经验项目优化经验——垃圾回收导致的性能问题垃圾回收导致的性能问题
谈谈最近优化一个网站项目的经验,首先说一下背景情况:
1) 在页面后台代码中我们把页面上大部分的HTML都使用字符串来拼接生成然后直接赋值给LiteralControl。
2) 网站CPU很高,基本都在80%左右,即使使用了StringBuilder来拼接字符串性能也不理想。
3) 为了改善性能,把整个字符串保存在memcached中,性能还是不理想。
在比较了这个网站和其它网站服务器上相关性能监视器指标后发现有一个参数特别显眼:
就是其中的每秒分配字节数,这个性能比较差的网站每秒分配2GB的内存(而且需要注意由于性能监视器是每秒更新一下,对
于一个非常健康的网站这个值应该经常看到是0才对)!而其它一些网站只分配200M左右的内存。服务器配备4G内存,而每
秒分配2G内存,我想垃圾回收器一定需要不断运行来回收这些内存。观察%Time in GC可以发现,这个值一直在10%左右,
也就是说上次回收到这次回收间隔10秒的话,这次垃圾回收1秒,由于回收的时间相对固定,那么这个值可以反映回收的频繁
度。
知道了这个要点就知道了方向,在项目中找可能的问题点:
1) 是否分配了大量临时的小对象
2) 是否分配了数量不多但比较大的大对象
在经历了一番查找之后,发现一个比较大的问题,虽然使用了memcached来缓存整个页面的HTML,但是在输出之前居然进
行了几次string的Replace操作,这样就产生了几个大的字符串,我们来做一个实验模拟这种场景:
public partial class _Default : System.Web.UI.Page
{
static string template;
protected void Page_Load(object sender, EventArgs e)
{
if (template == null)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++)
sb.Append("1234567890");
template = sb.ToString();
}
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 1; i++)
{
long mem1 = GC.GetTotalMemory(false);
string s = template + i;
long mem2 = GC.GetTotalMemory(false);
Response.Write((mem2 - mem1).ToString("N0"));
Response.Write("<br/>");
GC.KeepAlive(s);
}
for (int i = 0; i < 100000; i++)
{
double d = Math.Sqrt(i);
}
Thread.Sleep(30);
Response.Write(sw.ElapsedMilliseconds);
}
}
在这段代码中:
1) 我们首先使用一个静态变量模拟缓存中的待输出的HTML
2) 我们中间的一段代码测算一下这个字符串占用的内存空间
3) 随后我们做了一些消耗CPU的运算操作来模拟页面的一些计算
weixin_38667207
- 粉丝: 3
- 资源: 965
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0