← Back to team overview

sslug-teknik team mailing list archive

Re: rsh port problem

 

On Fri, 25 Apr 2008 15:06:47 +0200, Jon Bendtsen wrote:

<snip>

>> I xinetd, kan jeg sætte en grænse for, hvor mange indkommende
>> forbindelser, der må laves per sekund - og hvor lang tid der skal
>> blokkeres (helt), hvis dette tal overskrides. Dette gøres af linier som
>> f.eks.
>> cps 200 1
>> (max 200 per sekund - stop et sekund, hvis det overskrides). Standard
>> er lavere (typisk max 30 per sekund) -og det kan godt have noget at
>> gøre med hvor tit der ryddes op i brugte porte. Men jeg ved bare ikke,
>> hvor sådan noget foregår - eller om jeg overhovedet har ret i min
>> antagelse.
> 
> Det var netop i xinetd jeg mente at du kunne justere hvor mange den
> skulle starte.

OK.

> Lige så snart xinetd overtager så tror jeg at forbindelsen bliver
> flyttet til en anden port.
> Et andet problem kunne være hvor mange TCP forbindelser du må have pr.
> ip
> eller åbne filer. Prøv at hæfte en strace på din xinetd process og se
> hvad der
> sker når du laver mange rsh forbindelser.

Hmm... Faktisk laver jeg kun 2-3 rsh'er af gangen. Det går godt 
de første "nogle hundrede" gange.

Jeg har ikke erfaringer med strace - jeg håber på fortsat hjælp...

Jeg har prøvet med strace f.eks.:
  strace -f -o xinetd.strace.0003 xinetd -dontfork -stayalive
Hvis jeg kører med "-f" for at se, hvad children laver, så 
bliver der genereret så meget log, at systemet sløver ned 
(antallet af logins per sekund falder) og problemet ophører. 
Dette også selvom jeg reducerer output-mængde med 
  -e trace=network

Hvis jeg kun laver strace på hovedprocessen, så kan jeg 
fortsat reproducere problemet.
Efter initiel processering venter xinetd på indkommende:


# LOGSTART. Venter på ny proc HER v
select(7, [3 5 6], NULL, NULL, NULL)    = 1 (in [6])
accept(6, {sa_family=AF_INET6, sin6_port=htons(1022), inet_pton(AF_INET6, 
"::ffff:192.168.0.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 
[28]) = 8
setsockopt(8, SOL_IPV6, IPV6_ADDRFORM, [2], 4) = 0
time(NULL)                              = 1209455440
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|
SIGCHLD, child_tidptr=0xb7efb758) = 23979
time(NULL)                              = 1209455440
close(8)                                = 0
select(7, [3 5 6], NULL, NULL, NULL)    = ? ERESTARTNOHAND (To be 
restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
write(4, "\21", 1)                      = 1
sigreturn()                             = ? (mask now [])
select(7, [3 5 6], NULL, NULL, NULL)    = 1 (in [3])
ioctl(3, FIONREAD, [1])                 = 0
read(3, "\21", 1)                       = 1
waitpid(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WNOHANG) = 23979
close(-1)                               = -1 EBADF (Bad file descriptor)
waitpid(-1, 0xbfe46e78, WNOHANG)        = -1 ECHILD (No child processes)
select(7, [3 5 6], NULL, NULL, NULL
# LOGSTOP. Her ventes på næste     ^

Det må være sådan at:
  * der kommer ind (accept)
  * der laves fork - ny process (child) PID=23979
  * Child slutter, og høstes med waitpid.

Jeg forstår ikke fuldt ud indholdet af 'accept'-delen (linie 2),
og jeg bryder mig ikke meget om linien "close(-1) ... EBADF ...".

Hvis jeg laver mange rsh'er (efter hinanden - kun een samtidig),
så bliver der efter noget tid (klient-side) 
  'poll: protocol failure in circuit setup'
men der er ikke nogen ændring i, hvordan strace viser det på 
server-siden.

> JonB

-Bjarne


Follow ups

References