请大家来会诊CSDN的问题, 谢谢了...

zdg CSDN 技术总监  2000-04-17 08:53:00
加精
最近CSDN老出问题, 原因是因为重新安装Windows NT造成的, 有很多问题我们也很疑惑, 请大家出手来会诊CSDN的问题...
现在服务器安装的是中文Windows NT 4.0+英文Option Pack
问题现象
1)有时ASP停止服务, 莫名其妙
2)有时连接数过多, 停止Web服务仍然有500个连接, 不知道这些连接是哪儿来的.
3)ASP处理能力明显慢了...
如果大家遇到过这种类似问题, 请多多出谋划策...谢谢了...
...全文
357 点赞 收藏 20
写回复
20 条回复
huitor 2000年04月24日
佩服!我没有想到CSDN是采用ACCESS数据库的。竟然可以支持这么一个网站.
回复 点赞
telan 2000年04月19日
To Zdg:
在每个页面中都包含了:
datebase.inc文件,打开连接:

Set Conn=Server.CreateObject("ADODB.Connection")
Connstr="DBQ="+server.mappath("vforum.mdb")+";DRIVER={Microsoft Access Driver (*.mdb)};"
Conn.Open connstr

但都没有显式的关闭,在每页的最后加一个:

Conn.Close
Set Conn=Nothing

对于记录集也应该在不用的时候关闭:
rs.Close
Set rs=Nothing

对于数据库连接,使用的原则应该是:
尽量晚打开连接,尽量早地关闭连接。

回复 点赞
zdg 2000年04月17日
给csdn2000: 中文OP我安装出问题, 说版本不够高.
给eaglet: 论坛暂时还没有用SQL Server 7.0
给Jackzhu: win2000的Bug是不是更多. 换UNIX的变动太大了.
给telan: 论坛目前只用了一个Session变量, 占不了太多的内存.

回复 点赞
telan 2000年04月17日
别使用Session变量,使用Cookie代替Session变量。
回复 点赞
Jackzhu 2000年04月17日
升级的win2000,或者干脆采用unix
回复 点赞
eaglet 2000年04月17日
SQL Sever 6.5 和Sql server 7.0
对ASP的支持是不同的,我就曾遇到
原来在SQL SERVER 6.5 下运行正常
但在SQL SERVER 7.0 下运行出错的
情况.
回复 点赞
csdn2000 2000年04月17日
是不是英文Option Pack的问题,如果需要中文OP,我有。
回复 点赞
zdg 2000年04月17日
不应该是数据库的问题, 因为以前也装了SQL Server...
只不过这次换的是SQL Server 7.0
回复 点赞
ring 2000年04月17日
是不是数据库出问题了?
要不再重装一遍吧
回复 点赞
hcat1999 2000年04月17日
还有问题,我们是两个网站(www.csdn.net,www.midatech.com)共用一个IP,原来都相安无事,但是现在毛病却很多,两个网站现在都很慢,而且Email(Imail Server)也特别慢.
不知哪位大虾对这一块特别熟悉,如果方便可以到我们的公司来坐坐,帮忙解决以上问题,先谢过了.
回复 点赞
Chen_Lin 2000年04月17日
扼杀IIS服务器性能的十条戒律
发布日期: 2000-3-27
内容:

From: Microsoft

下面的每一条戒律都将有效地影响代码的性能和可伸缩性。换句话说,尽可能不要照着戒律去做!下面,我将解释如何破坏他们以便提高性能和可伸缩性。


1、应该分配和释放多个对象

你应该尽量避免过量分配内存,因为内存分配可能是代价高昂的。释放内存块可能更昂贵,因为大多数分配算符总是企图连接临近的已释放的内存块成为更大的块。直到Windows NT? 4.0 service pack 4.0,在多线程处理中,系统堆通常都运行得很糟。堆被一个全局锁保护,并且在多处理器系统上是不可扩展的。

2.不应该考虑使用处理器高速缓存

大多数人都知道由虚拟内存子系统导致的hard 页错误代价很高,最好避免。但是许多人认为其他内存访问方法没有什么区别。自从80486以后,这一观点就不对了。现代的CPUs比RAM要快得多,RAM至少需要两级内存缓存 ,高速L1 缓存能保存8KB数据和8KB指令,而较慢的L2 缓存能保存几百KB的数据和代码,这些数据和代码混合在一起。L1 缓存中内存区域的一个引用需要一个时钟周期,L2 缓存的引用需要4到7个时钟周期,而主内存的引用需要许多个处理器时钟周期。后一数字不久将会超过100个时钟周期。在许多方面,缓存像一个小型的,高速的,虚拟内存系统。

至于和缓存有关的基本内存单元不是字节而是缓存列。Pentium 缓存列有32个字节宽。Alpha 缓存列有64个字节宽。这意味着在L1 缓存中只有512个slot给代码和数据。如果多个数据一起使用(时间位置)而并不存储在一起(空间位置),性能会很差。数组的空间位置很好,而相互连接的列表和其他基于指针的数据结构的位置往往很差。

把数据打包到同一个缓存列中通常会有利于提高性能,但是它也会破坏多处理器系统的性能。内存子系统很难协调处理器间的缓存。如果一个被所有处理器使用的只读数据,和一个由一个处理器使用并频繁更新的数据共享一个缓存 列,那么缓存将会花费很长时间更新这个缓存列的拷贝。这个Ping-Pong高速游戏通常被称为"缓存 sloshing"。如果只读数据在一个不同的缓存 列中,就可以避免sloshing。

对代码进行空间优化比进行速度优化效率更高。代码越少,代码所占的页也越少,这样需要的运行设置和产生的页错误也会更少,同时占据的缓存 列也会更少。然而,某些核心函数应该进行速度优化。可以利用profiler去识别这些函数。

3.决不要缓存频繁使用的数据。

软件缓存可以被各种应用程序使用。当一个计算代价很高时,你会保存结果的一个拷贝。这是一个典型的时空折中方法:牺牲一些存储空间以节省时间。如果做得好,这种方法可能非常有效。

你必须正确地进行缓存。如果缓存了错误数据,就会浪费存储空间。如果缓存得太多,其他操作可以使用的内存将会很少。如果缓存得太少,效率又会很低,因为你必须重新计算被缓存 遗漏的数据。如果将时间敏感数据缓存得时间过长,这些数据将会过时。一般,服务器更关心的是速度而不是空间,所以他们要比桌面系统进行更多的缓存。一定要定期去除不用的缓存,否则将会有运行设置问题。

4.应该创建多个线程,越多越好。

调整服务器中起作用的线程数目是很重要的。如果线程是I/O-bound的,将会花费很多时间用来等待I/O的完成-一个被阻塞的线程就是一个不做任何有用工作的线程。加入额外的线程可以增加通量,但是加入过多的线程将会降低服务器的性能,因为上下文交换将会成为一个重大的overhead。上下文交换速度应该低的原因有三个:上下文交换是单纯的overhead,对应用程序的工作没有任何益处;上下文交换用尽了宝贵的时钟周期;最糟的是,上下文交换将处理器的缓存填满了没用的数据,替换这些数据是代价高昂的。

有很多事情是依靠你的线程化结构的。每个客户端一个线程是绝对不合适的。因为对于大量用户端,它的扩展性不好。上下文交换变得难以忍受,Windows NT用尽了资源。线程池模型会工作得更好,在这种方法中一个工人线程池将处理一条请求列,因为Windows 2000提供了相应的APIs,如QueueUserWorkItem。

5.应该对数据结构使用全局锁

使数据线程安全的最简单方法是把它套上一把大锁。为简单起见,所有的东西都用同一把锁。这种方法会有一个问题:序列化。为了得到锁,每一个要处理数据的线程都必须排队等候。如果线程被一把锁阻塞,它没有在做任何有用的事。当服务器的负载较轻时,这个问题并不常见,因为一次可能只有一个线程需要锁。在负载很重的情况下,对锁的激烈争夺可能就会成为一个大问题。

设想在多车道高速公路上发生了一个意外事故,这条高速公路上的所有车辆都被转向一条狭窄的道路。如果车辆很少,这一转换对交通流的速率的影响可以忽略。如果车辆很多,当车辆慢慢并入那条单通道时,交通阻塞会延伸几英里。

有几种技术能够减少锁竞争。

· 不要过分保护,也就是说,不是非常必要不要锁住数据。只有需要时才去持有锁,而且时间不要过长。不要在大段代码周围或频繁执行的代码中没必要地使用锁,这一点很重要。
· 对数据进行分割,使它能够用一套独立的锁保护。例如,一个符号表可以按标识符的第一个字母分割,这样在修改名字以Q开头的符号的值时,就不会去读名字以H开头的符号的值。
· 使用APIs的Interlocked 系列(InterlockedIncrement,InterlockedCompareExchangePointer等)自动修改数据而不需要锁。
· 当数据不是经常被修改时可以使用多读者/单作者(multi-reader/single-writer)锁。你将获得更好的并发性,尽管锁操作的代价将更高并且你可能会冒饿死作者的危险。
· 在关键部分使用循环计数器。参见Windows NT 4.0 service pack 3中的SetCriticalSectionSpinCount API。
· 如果你不能得到锁,使用TryEnterCriticalSection并做一些其他的有用的工作。

高竞争导致serialization,serialization导致降低CPU的利用率,这促使用户加入更多的线程,结果事情变得更糟。


6.不必注意多处理器机器

你的代码在多处理器系统上比在单处理器系统上运行得还要糟,这可能是件令人恶心的事。一个很自然的想法是,在一个N维系统上运行N次会更好。性能很差的原因是竞争:锁竞争,总线竞争,和/或缓存列竞争。处理器都在是争夺共享资源的所有权,而不是做更多的工作。

如果你一定要编写多线程应用程序的话,你应该在多处理器盒上对你的应用程序进行强度测试和性能测试。单处理器系统通过时间分片地执行线程而提供一个并发性的假象。多处理器盒具有真正的并发性,竞争环境和竞争更容易发生。

7.应该始终使用模块化调用;他们很有趣。

利用同步模块化调用来执行I/O操作对大多数桌面应用程序来说是合适的。但是,他们不是使用服务器上的CPU(s)的好方法。I/O操作要花费上百万个时钟周期来完成,这些时钟周期本来可以被更好地利用。利用异步I/O你能得到显著提高的用户请求率和I/O通量,不过增加了额外的复杂性。

如果你有需要花费很长时间的模块化调用或I/O操作,你应该考调拨多少资源给他们。你想使用所有的线程还是有个限制?一般地,使用有限的几个线程要好些。构建一个小的线程池和队列,利用队列来安排线程的工作完成模块化调用。这样,其他线程就可以拾取和处理你的非模块化的请求。

8.不要进行测量

当你能够测量你所谈论的事情并用数字表达它时,这就表示你对他有了一定的了解;但是如果你不能用数字表达时,你的知识是贫瘠的不能令人满意的;这可能是知识的开始,但这时你简直不可能将你的思想提高到科学的水平。
- Lord Kelvin (William Thomson)

如果不测量你就不能了解应用程序的特性。你在黑暗中摸索,一半是靠猜测。如果不识别性能问题,你就不能做任何改进或做出工作量计划。

测量包括黑匣子测量和profiling。黑匣子测量的意思是收集由性能计数器(内存使用,上下文交换,CPU利用等)和外部检测工具(通量,反映时间等)所显示的数据。为了profile你的代码,你编译代码的一个工具版,然后在各种条件下运行它,并收集关于执行时间和过程调用频率的统计数据。

测量如果不用于分析的话就一点用都没有。测量将不仅告诉你有问题,而且甚至能帮助你找到问题发生在哪,但它不能告诉你为什么会有问题。对问题进行分析以便你能正确地改正他们。要从根本上解决问题而不是停留在表面现象。

当你进行改动后,要重新测量。你要知道你的改动是否有效。改动也可能会暴露其他性能问题,测量-分析-改正-再测量的循环就会重新开始。你也必须要有规律地进行测量,以便发现性能衰退问题。

9.应该使用单一用户,单一请求的测试方法。

书写ASP和ISAPI应用程序的一个通病是只用一个浏览器去测试应用程序。当他们在Internet上应用他们的程序时,他们才发现他们的应用程序不能处理高负载,并且通量和反应时间另人可怜。

用一个浏览器测试是必要的但是不够的。如果浏览器反应得不够快,你就知道你有麻烦了。但即使它在使用一个浏览器时很快,你也不知道它处理负载的能力如何。如果十几个用户同时请求会发生什么事?一百个呢?你的应用程序能容忍什么样的通量?它能提供什么样的反应时间?在轻载时这些数字会怎样?中等负载呢?重载呢?在多处理器机器上你的应用程序会如何?对你的应用程序进行强度测试,这对于找出bugs发现性能问题来说是基本的。

类似的负载测试考虑适用于所有的服务器应用程序。

10.不应使用实际环境。

人们往往只在几个特定的,人工的环境(如下benchmarks)下调整应用程序。选择和实际情况相对应的各种情况,并为针对各种操作进行优化,这一点很重要。如果你不这样做,你的用户和评论家一定会这样做,并且他们将依此来评判你的应用程序的好坏。

以上资料来自:绿色兵团
回复 点赞
csdn2000 2000年04月17日
对WIN作网站也不能一概而论。www.microsoft.com就是全用WIN做的。
回复 点赞
usage 2000年04月17日
好的网站就不有WIN
回复 点赞
zdg 2000年04月17日
谢谢大家, 尤其是 telan, 因为这份代码写的时间有点长了, 很多不好的地方, 我会尽快改过来...
有时连接数过多, 停止Web服务仍然有500个连接是不是因为rs没有释放的原因呢???
回复 点赞
telan 2000年04月17日
看了看TopicView.asp和ReplyNews.asp、Logon.asp
的源代码之后,才明白为什么CSDN性能这么差,不断的
更新数据库,不断地插入新记录,………而且用的是
ACCESS数据库,不慢才怪!!!

此外,有些SQL语句也没有仔细斟酌,比如:

set rs=Conn.Execute("select * from cuser where UserName="
& SqlStr(Session("username")))
if rs.EOF then Response.Redirect "index1.asp?id="&newsid
m_id=rs("UserID")

这儿只不过是为了判断数据库中是否有此用户,就大动干戈的
select * ,好多地方都是这样。

虽然Session变量只有一个username,但是,由于session的超时
机制,只要一会不用,再进来又要重新输入用户名和密码,对于
用户实在是不方便。我的建议还是采用Cookie,但不用设Cookie
的expire时间,这样浏览器不关,COOKIE就有效,不用再重新输入。

不过,我个人认为,要有实质性的改善,必须要对整个程序流程
重新设计,采用SQL Server数据库迫在眉睫。

回复 点赞
haihong 2000年04月17日
service pack 现在应该有6了,
win2000 不错的,从来不死机
但是好象性能不是很快。
回复 点赞
tntzhou 2000年04月17日
因为您的问题和错误情况描述的不是很清楚,我只能就我在字面上的理解发表我的建议:
1.如果重新安装了NT,和service pack,则相应的应用程序要重新安装,如ie,sql server.
2.建议您增加内存。
3.在iis的控制台修改web网站的属性.如:将无限的连接时间设定为某一适中值,将active http keep设置为无效,启用带宽抑制,并调节到合适的带宽。
4.在sql server 中设置减低最大内存使用,提高最小内存使用。
如果还有问题存在,请与我来件,并说明详细的症状,我愿意和您共同探讨这一问题!
回复 点赞
MarsXia 2000年04月17日
Install Service Pack 6 for China.
I think it's some trouble in IIS.
Try it?
回复 点赞
csdn2000 2000年04月17日
你的Option Pack是多少版本。另外Service Pack起码得用SP4以上。
回复 点赞
telan 2000年04月17日
还没有用SQL Server啊!???
赶紧换上吧,不过要多准备点内存,
至少先来1G吧!!!
回复 点赞
发动态
发帖子
Windows Server
创建于2007-08-02

6022

社区成员

17.8w+

社区内容

Windows 2016/2012/2008/2003/2000/NT
社区公告
暂无公告