IIS 모듈 차단 무거운 트래픽을 사이트
문제
질문
안녕하세요,
약간의 배경에 문제...나는 현재 사이트에 내장된 ISP 나는 작업에 대한 표시하는 메시지에 따라 사용자에게 자신의 결제 상태입니다.있을 때에 비로 지불 나는 디스플레 Non-지불하는 메시지와는 경우 그들은 학대를 표시하는 메시지를 남용,등등.교통에 의해 생성되는 시스코 SCE 는 리디렉션을 최종 사용자의 HTTP 트래픽을 내 사이트입니다.
문제는 나를 보는 과도한 트래픽.내가 믿 교통 수 있습 P2P 트래픽,자동적인 업데이트를,또는 다른 것입니다.기본적으로 아무것도 사용하는 포트 80 동으로 SCE 내 페이지입니다.
솔루션 내가 하려고 시행에 나 서버를 넣어 모듈에서의 배치 블록에 따라 사용자에게 자신의 계산합니다.그렇다면 그들은 임계값을 초과하는 동안 일정한 시간의 지속 시간에,그들은 다른 페이지로 이동하는 것입니다 희망을 가지고 오프로드 프로세서의하지 않을 것이기 때문이해야 할 모든 SQL 조회 및 정보에서 발생하는 ASP.NET 페이지입니다.
그러나 빠르게 액세스할 수 있을 적용하는 모듈 내장,그것은 실제로 반대의 결과(증가 CPU 부하).모듈을 사용하여 메모리에 저장되는 테이블 응용 프로그램 상태에는 그 사용을 추적하는 요청에 의 IP.여기에는 코드를 위한 모듈:
public class IpHitCount : IHttpModule
{
const string tableKey = "appIpLog";
#region IHttpModule Members
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute += new EventHandler(checkHitCount);
}
#endregion
private void checkHitCount(object sender, EventArgs e)
{
// Cast the parameter into a HttpApp object
HttpApplication app = (HttpApplication)sender;
// make sure that this is the user's first request for the app
// (all first requests are routed through main)
if (app.Request.Url.AbsolutePath.ToLower().Contains("main.aspx"))
{
// If the in memory table does not exist, then create it
if (app.Application[tableKey] == null)
{
app.Application[tableKey] = CreateTable();
}
DataSet ds = (DataSet)app.Application[tableKey];
DataTable tbl = ds.Tables["IpTable"];
DeleteOldEntries(tbl);
string filter = string.Format("ip = '{0}'", app.Request.UserHostAddress);
DataRow[] matchedRows = tbl.Select(filter);
if (matchedRows.Length > 0)
{
DataRow matchedRow = matchedRows[0];
if ((int)matchedRow["hitCount"] > 4)
{
app.Response.Redirect("HitCountExceeded.htm", true);
}
else
{
matchedRow["hitCount"] = (int)matchedRow["hitCount"] + 1;
}
}
else
{
DataRow newEntry = tbl.NewRow();
newEntry["timestamp"] = DateTime.Now;
newEntry["hitCount"] = 1;
newEntry["ip"] = app.Request.UserHostAddress;
tbl.Rows.Add(newEntry);
}
}
}
private DataSet CreateTable()
{
DataSet ds = new DataSet();
DataTable table = new DataTable("IpTable");
DataColumn col1 = new DataColumn("timestamp", typeof(DateTime));
col1.AutoIncrement = false;
col1.DefaultValue = DateTime.Now;
col1.ReadOnly = false;
col1.Unique = false;
DataColumn col2 = new DataColumn("ip", typeof(string));
col1.AutoIncrement = false;
col1.ReadOnly = false;
col1.Unique = false;
DataColumn col3 = new DataColumn("hitCount", typeof(int));
col1.AutoIncrement = false;
col1.ReadOnly = false;
col1.Unique = false;
table.Columns.Add(col1);
table.Columns.Add(col2);
table.Columns.Add(col3);
ds.Tables.Add(table);
return ds;
}
private void DeleteOldEntries(DataTable tbl)
{
// build the where clause
string filter = "timestamp < '" + DateTime.Now.AddMinutes(-5.0).ToString() + "'";
// run the query against the table
DataRow[] rowsToDelete = tbl.Select(filter);
// individually delete each row returned
foreach (DataRow row in rowsToDelete)
{
row.Delete();
}
}
}
그래서 내가 무엇인지 궁금은 다음과 같다:뭔가가있다 당신이 볼 수있는 나는 잘못을 모듈에서는 원인이 될 수도 있습니다 CPU 사용률이 높?이 있는 다른 방법을해야 나단 이래?
어떤 도움을 제공할 수 있습니다.
감사합니다, C
솔루션
내가 코드를 변경에 모듈을 실행하여 삭제 섹션 1 분마다:
if (app.Application[deletedKey] == null)
app.Application[deletedKey] = DateTime.Now;
DateTime deletedDate = (DateTime)app.Application[deletedKey];
if (DateTime.Now >= deletedDate.AddMinutes(1))
{
DeleteOldEntries(tbl);
app.Application[deletedKey] = DateTime.Now;
}
또한 추가 코드고 생각되는 인덱스를 IP 열의 내용합니다.그것이 옳은 것 같지 않지만,그래서 나는 특정하지 않은 것을 내가 무슨 하려는 그것을 마:
DataColumn[] key = new DataColumn[1];
key[0] = col1;
table.PrimaryKey = key;
ds.Tables.Add(table);
후에는 위의 두 변경,CPU 의 부하를 감소했습니다.내가 상상하는 우리의 SQL 서버가 하나님께 감사제할 수 있는 마지막으로 호흡입니다.
의 모든 주셔서 감사합니다 도움!!
해결책
내가 시도해 볼 몇 가지가 있습니다.
- 가장 먼저 보는 것은이 코드가 실행될 때마다 "deleteoldentries"서브를 호출한다는 것입니다. 특정 시간에만 실행하도록 제한 할 수있는 또 다른 방법이 있습니까? 15 초마다 실행되는 타이머가 아니라면 "checkHitCount"가 실행될 때마다 증가하는 상태에서 두 번째 변수 ( "execcount"와 같은 두 번째 변수가있을 수 있으므로 10 번째 또는 20 시간마다 만 제거 할 수 있습니까? 이런 식으로, 당신은 매번 실행할 때마다 코드의 잠재적으로 비싼 섹션을 피할 수 있습니다.
- 다른 옵션은 데이터 가능에 인덱스를 추가하는 것입니다. .NET이 데이터 레이스에서 어떻게 조회를 처리하는지 잘 모르겠지만 아마도 이것은 당신에게 관심이있을 것입니다. MSDN 기사
ANTS Profiler와 같은 것을 사용하여 실행 중에 가장 많은 시간이 소비되는 위치를 확인할 수 있습니까? 이 페이지가 여러 번/초라고 불리는 것으로 생각되기 때문에 어떤 식 으로든 약간의 영향을 줄일 수 있으면 큰 차이가 생길 수 있습니다.
결과를 얻었지만 여전히 행복하지 않은 경우, 귀하가 만족하는 솔루션을 향해 계속 노력할 수 있도록 새로운 정보를 추가하도록 질문을 수정하십시오.
다른 팁
만,당신이 기억하는 데이터를 메모리 및 로 검색을 통해 데이터 집합이,그것의 많은 CPU 사이클을 찾기 위해 기록됩니다.
를 추가하는 것이기 때문에 사실 이것은 웹 응용 프로그램,당신의 많은 숙박,그래서 당신은 끝날 것이 일상적인 매우,매우 많습니다.
나의 권고 저장하는 것도 하중 센서 데이터베이스 서버 및 그 후 업데이트 및 쿼리를 보려면 서버는 경우 히트 수 초과했습니다.그것을 처리할 수 있을 것입니다 부하뿐만 아니라 처리하는 데이터의 크기가 설정되는 것을 쿼리가 있습니다.