ParaStation protocol p4sock

ParaStation provides its own communication protocol for Ethernet, called p4sock. This protocol is designed for extremely fast and reliable communication within a closed and homogeneous compute cluster environment.

The protocol implements a reliable, connection-oriented communication layer, especially designed for very low overhead. As a result, it delivers very low latencies.

The p4sock protocol is encapsulated within the kernel module p4sock.ko. This module is loaded on system startup or whenever the ParaStation daemon psid(8) starts up and the p4sock protocol is enabled within the configuration file parastation.conf(5).

The p4sock.ko module inserts a number of entries within the /proc filesystem. All ParaStation entries are located within the subdirectory /proc/sys/ps4. Three different subdirectories, listed below, are available.

To read a value, e.g. just type

  # cat /proc/sys/ps4/state/connections

to get the number of currently open connections. To modify a value, for e.g. type

  # echo 10 > /proc/sys/ps4/state/ResendTimeout

to set the new value for ResendTimeout.

Directory /proc/sys/ps4/state

Within this state directory, various entries showing protocol counters. All these entries, except polling, are read only!

  • HZ: reads the number of timer interrupts per second for this kernel ("jiffies").

    Note

    A jiffy is the base unit for system timers, used by the Linux kernel. So all timeouts within the kernel are based on this timer resolution. On kernels with version 2.4, this it typically 100Hz (= 10ms). But there are kernel versions available, e.g. for newer SuSE Linux versions, which include patches to change this to a much higher value!

  • connections: reads the current number of open connections.

  • polling: returns the current value for the polling flag: 0 = never poll, 1 = poll if otherwise idle (number of runable processes < number of CPUs), 2 = always poll. Writing this value will immediately change the polling strategy.

  • recv_net_ack: number of received ACKs.

  • recv_net_ctrl: number of received control packets (ACK, NACK, SYN, SYNACK, ...).

  • recv_net_data: number of received data packets.

  • recv_net_nack: number of received NACKs.

  • recv_user: number of packets delivered to application buffers.

  • send_net_ack: number of sent ACKs.

  • send_net_ctrl: number of sent control packets.

  • send_net_data: number of sent data packets.

  • send_net_nack: number of sent NACKs.

  • send_user: number of packets sent by the application.

  • sockets: number of open sockets connecting to the ParaStation protocol module.

  • timer_ack: number of expired delayed ACK timers.

  • timer_resend: number of expired resend timers.

Directory /proc/sys/ps4/ether

Within this directory, all Ethernet related parameters for the ParaStation p4sock protocol are grouped. All these entries can be read and written, newly written values will be used immediately.

  • AckDelay: maximum delay in "jiffies" for ACK messages. If no message is sent within this time frame, where an ACK for already received packets can be "hooked up", a single ACK message will generated. Must be less then ResendTimeout.

  • MaxAcksPending: maximum number of pending ACK messages until an "urgent" ACK messages will be sent.

  • MaxDevSendQSize: maximum number of entries of the (protocol internal) send queue to the network device.

  • MaxMTU: maximum packet size used for network packets. For sending packets, the minimum of MaxMTU and service specific MTU will be used.

  • MaxRecvQSize: size of the protocol internal receive queue.

  • MaxResend: Number of retries until a connection is declared as dead.

  • MaxSendQSize: size of the protocol internal send queue.

  • ResendTimeout: delay in "jiffies" for resending packets not acknowledged up to now. Must be greater then AckDelay.

Directory /proc/sys/ps4/local

Currently, there are no entries defined for this directory.

p4stat

The command p4stat can be used to list open sockets and network connections of the p4sock protocol.

  $ /opt/parastation/bin/p4stat -s
  Socket #0 : Addr: <00><00><00><00><00><'........' last_idx 0 refs 2
  Socket #1 : Addr: <70><6f><72><74><33><'port384.' last_idx 0 refs 10
  Socket #2 : Addr: <70><6f><72><74><31><'port144.' last_idx 0 refs 10
  
  $ /opt/parastation/bin/p4stat -n
  net_idx  SSeqNo SWindow RSeqNo RWindow lusridx lnetidx rnetidx snq rnq refs
       84   30107   30467  30109   30468      84      84     230   0   0    2
       85   30106   30466  30106   30465      85      85     231   0   0    2
       86   30107   30467  30109   30468      86      86     84    0   0    2
       87   30106   30466  30106   30465      87      87     85    0   0    2
       88   30107   30467  30109   30468      88      88     217   0   0    2
       89   30106   30466  30106   30465      89      89     218   0   0    2
       90   30106   30466  30106   30465      90      90     220   0   0    2
       91   30106   30466  30106   30465      91      91     221   0   0    2
       92   30001   30361  30003   30362      92      92     232   0   0    2
       93   30001   30361  30003   30362      93      93     219   0   0    2
       94   30000   30000  30001   30360      94      94     233   0   0    2
       95   30000   30000  30001   30360      95      95     222   0   0    2
       96   30000   30000  30001   30360      96      96     222   0   0    2
          

This command shows some protocol internal parameters, like open connections, sequence numbers, reference counters, etc. For more information, see p4stat(8).