> did you  look at my code below?

Not really. Each time I see a TTimer triggered every 100 mSec (or any very 
short time period), I know this will cause CPU problem. And bandwidth 
limitation defenitely doesn't require a so short period of time. What is 
useful, regarding bandwidth limitation - is to have bandwidth limited on a 
reasonable time period (a few second IMO).

It is likely that each time you resume the socket, winsock send a FD_WRITE 
message to get more data to send. That's why the CPU is used there.
--
[EMAIL PROTECTED]
http://www.overbyte.be

----- Original Message ----- 
From: "Fastream Technologies" <[EMAIL PROTECTED]>
To: "ICS support mailing" <twsocket@elists.org>
Sent: Sunday, January 29, 2006 10:04 AM
Subject: Re: [twsocket] THttpConnection throttling problem with timer


> But it does not work that way! Maybe my logic is a bit different, did you
> look at my code below?
>
> Regards,
>
> SZ
>
> ----- Original Message ----- 
> From: "Francois PIETTE" <[EMAIL PROTECTED]>
> To: "ICS support mailing" <twsocket@elists.org>
> Sent: Sunday, January 29, 2006 10:50 AM
> Subject: Re: [twsocket] THttpConnection throttling problem with timer
>
>
>> 100 mSec is way too short. Use 2000 mSec or more.
>> --
>> [EMAIL PROTECTED]
>> http://www.overbyte.be
>>
>> ----- Original Message ----- 
>> From: "Fastream Technologies" <[EMAIL PROTECTED]>
>> To: "ICS support mailing" <twsocket@elists.org>
>> Sent: Sunday, January 29, 2006 8:41 AM
>> Subject: [twsocket] THttpConnection throttling problem with timer
>>
>>
>>> Hello,
>>>
>>> I implemented -almost- the same mechanism as THttpCli as Francois said.
>>> The
>>> timer runs per every 100ms and the code is below:
>>>
>>> void __fastcall httpServerThread::TimerResume(TObject *Sender)
>>> {
>>>        if(resumeTimerTick % (10 * 8) == 0)
>>>        {
>>>                serverPermissions->resetConsumedSpeedLimit();
>>>
>>>                httpServerClientClass *bufferClient;
>>>
>>>                for(int i = 0; i < HTTPServer->ClientCount; ++i)
>>>                {
>>>                        bufferClient =
>>> (httpServerClientClass*)HTTPServer->Client[i];
>>>
>>>                        if(!bufferClient->bandwidthPermissions)
>>>                                continue;
>>>
>>>                        if(bufferClient->paused)
>>>                        {
>>>                                bufferClient->paused = false;
>>>
>>> PostThreadMessage(bufferClient->affinityThread->ThreadID,
>>> WM_RESUME_CLIENT, (WPARAM)bufferClient, 0);
>>>                        }
>>>                }
>>>        }
>>>        else
>>>        {
>>>                httpServerClientClass *bufferClient;
>>>
>>>                for(int i = 0; i < HTTPServer->ClientCount; ++i)
>>>                {
>>>                        bufferClient =
>>> (httpServerClientClass*)HTTPServer->Client[i];
>>>
>>>                        if(!bufferClient->bandwidthPermissions)
>>>                                continue;
>>>
>>>                        if(!bufferClient->paused)
>>>                        {
>>>
>>> if(bufferClient->bandwidthPermissions->isSpeedLimitReached())
>>>                                {
>>>                                        bufferClient->paused = true;
>>>                                        //bufferClient->Pause();
>>>
>>>
>>> PostThreadMessage(bufferClient->affinityThread->ThreadID,
>>> WM_PAUSE_CLIENT, (WPARAM)bufferClient, 0);
>>>                                }
>>>                        }
>>>
>>>
>>> PostThreadMessage(bufferClient->affinityThread->ThreadID,
>>> WM_CLIENT_TIMER, (WPARAM)bufferClient, 0);
>>>                }
>>>        }
>>>
>>>        ++resumeTimerTick;
>>> }
>>> //---------------------------------------------------------------------------
>>>
>>>
>>> When the throttling is enabled, the CPU usage goes to 100%. Aqtime code
>>> profiler tells me that the below function is the reason of it:
>>>
>>> procedure TCustomWSocket.TryToSend;
>>> var
>>>    oBuffer   : TBuffer;
>>>    Len       : Integer;
>>>    Count     : Integer;
>>>    Data      : Pointer;
>>>    LastError : Integer;
>>>    { p         : PChar;23/12/01}
>>>    bMore     : Boolean;
>>> // Hit Count          : 29731
>>> // Time               : 19,86
>>> // Time with Children : 22,74
>>> begin
>>>    if (FHSocket = INVALID_SOCKET) or                { No more
>>> t      }
>>>       (FBufList.Count = 0)                          { Nothing to
>>>      }
>>>       {or (bMoreFlag and (nMoreCnt >= nMoreMax))23/12/01} { Waiting more
>>> signal }
>>>    then begin
>>>        bAllSent := True;
>>>        exit;
>>>    end;
>>>
>>>    bMore := TRUE;
>>>    while bMore do begin
>>>        oBuffer := FBufList.First;
>>>        Data    := oBuffer.Peek(Len);
>>>        if Len <= 0 then begin
>>>            { Buffer is empty }
>>>            if FBufList.Count <= 1 then begin
>>>                { Every thing has been sent }
>>>                bAllSent := TRUE;
>>>                bMore    := FALSE;
>>>            end
>>>            else begin
>>>                oBuffer.Free;
>>>                FBufList.Delete(0);
>>>                FBufList.Pack;
>>>            end;
>>>        end
>>>        else begin
>>>            Count := RealSend(Data, Len);
>>>            if Count > 0 then begin
>>>                Dec(FBufferedByteCount, Count);  { V5.20 }
>>>                if FBufferedByteCount < 0 then
>>>                    FBufferedByteCount := 0;
>>>            end;
>>>            if Count = 0 then
>>>                bMore := FALSE  { Closed by remote }
>>>            else if count = SOCKET_ERROR then begin
>>>                LastError := WSocket_Synchronized_WSAGetLastError;
>>>                if (LastError = WSAECONNRESET) or (LastError =
>>> WSAENOTSOCK)
>>> or
>>>                   (LastError = WSAENOTCONN)   or (LastError = WSAEINVAL)
>>> or
>>>                   (LastError = WSAECONNABORTED)     { 07/05/99 }
>>>                then begin
>>> {$IFDEF DEBUG_OUTPUT}
>>>                    OutputDebugString(Name + ' Winsock.Send failed ' +
>>> IntToStr(LastError));
>>> {$ENDIF}
>>>                    FCloseInvoked := TRUE;           { 23/07/98 }
>>>                    Close;
>>>                    TriggerSessionClosed(LastError); { 23/07/98 }
>>>                end
>>>                else if LastError <> WSAEWOULDBLOCK then begin
>>>                    SocketError('TryToSend failed');
>>>                    Exit;
>>>                end;
>>>                bMore := FALSE;
>>>            end
>>>            else begin
>>>                oBuffer.Remove(Count);
>>>                if Count < Len then begin
>>>                    { Could not write as much as we wanted. Stop 
>>> sending }
>>> {$IFDEF DELPHI1}
>>>                    { A bug in some Trumpet Winsock implementation break
>>> he  }
>>>                    { background sending. Jan Tomasek
>>> <[EMAIL PROTECTED]> }
>>>                    if not TrumpetCompability then begin
>>>                        {bWrite := FALSE;23/12/01}
>>>                        bMore  := FALSE;
>>>                    end;
>>> {$ELSE}
>>>                    {bWrite := FALSE;23/12/01}
>>>                    bMore  := FALSE;
>>> {$ENDIF}
>>>                end;
>>>            end;
>>>        end;
>>>    end;
>>> end;
>>>
>>> Any idea why the bottle neck is? One interesting problem, the throttling
>>> cannot slow it any slower than 2.5 MBps! (local test) When the 
>>> throttling
>>> is
>>> shut down, the timer still runs but it is not paused/resumed and the CPU
>>> usage is less than 5%.
>>>
>>> Regards,
>>>
>>> SZ
>>>
>>> -- 
>>> To unsubscribe or change your settings for TWSocket mailing list
>>> please goto http://www.elists.org/mailman/listinfo/twsocket
>>> Visit our website at http://www.overbyte.be
>>
>> -- 
>> To unsubscribe or change your settings for TWSocket mailing list
>> please goto http://www.elists.org/mailman/listinfo/twsocket
>> Visit our website at http://www.overbyte.be
>
> -- 
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://www.elists.org/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be 

-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to