문제

질문

안녕하세요,

약간의 배경에 문제...나는 현재 사이트에 내장된 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 사이클을 찾기 위해 기록됩니다.

를 추가하는 것이기 때문에 사실 이것은 웹 응용 프로그램,당신의 많은 숙박,그래서 당신은 끝날 것이 일상적인 매우,매우 많습니다.

나의 권고 저장하는 것도 하중 센서 데이터베이스 서버 및 그 후 업데이트 및 쿼리를 보려면 서버는 경우 히트 수 초과했습니다.그것을 처리할 수 있을 것입니다 부하뿐만 아니라 처리하는 데이터의 크기가 설정되는 것을 쿼리가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top