Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Run Time System

The Acton Run Time System is what sets up the environment in which an Acton program runs. It performs bootstrapping of the root actor. The worker threads that carry out actual execution of actor continuations are part of the RTS. It is the RTS that handles scheduling of actors and the timer queue. All I/O is handled between modules in the standard library in conjunction with the RTS.

Arguments

It is possible to configure the RTS through a number of arguments. All arguments to the RTS start with --rts-. Use --rts-help to see a list of all arguments:

$ acton examples/helloworld.act
Building file examples/helloworld.act
  Compiling helloworld.act for release
   Finished compilation in   0.012 s
  Final compilation step
   Finished final compilation step in   0.198 s
$ examples/helloworld --rts-help
The Acton RTS reads and consumes the following options and arguments. All
other parameters are passed verbatim to the Acton application. Option
arguments can be passed either with --rts-option=ARG or --rts-option ARG

  --rts-bt-dbg                      Interactively debug on SIGILL / SIGSEGV
  --rts-debug                       RTS debug, requires program to be compiled with --debug
  --rts-ddb-host=HOST               DDB hostname
  --rts-ddb-port=PORT               DDB port [32000]
  --rts-ddb-replication=FACTOR      DDB replication factor [3]
  --rts-node-id=ID                  RTS node ID
  --rts-rack-id=RACK                RTS rack ID
  --rts-dc-id=DATACENTER            RTS datacenter ID
  --rts-host=RTSHOST                RTS hostname
  --rts-help                        Show this help
  --rts-mon-log-path=PATH           Path to RTS mon stats log
  --rts-mon-log-period=PERIOD       Periodicity of writing RTS mon stats log entry
  --rts-mon-on-exit                 Print RTS mon stats to stdout on exit
  --rts-mon-socket-path=PATH        Path to unix socket to expose RTS mon stats
  --rts-no-bt                       Disable automatic backtrace
  --rts-log-path=PATH               Path to RTS log
  --rts-log-stderr                  Log to stderr in addition to log file
  --rts-verbose                     Enable verbose RTS output
  --rts-wthreads=COUNT              Number of worker threads [#CPU cores]

$

Worker threads

Per default, the RTS starts as many worker threads as there are CPU threads available, although at least 4 and at most 255. This is optimized for server style workloads where it is presumed that the Acton program is the sole program consuming considerable resources. The limit of 255 is set when the program is built, with the max_wthreads build option.

It is possible to specify the number of worker threads with --rts-wthreads=COUNT, up to the same limit.

Actor method continuations run to completion, which is why it is wise not to set this value too low. Per default a minimum of 4 threads are started even when there are fewer CPU threads available, which means the operating system will switch between the threads inducing context switching overhead.

Open files

At startup, the RTS raises its soft limit on open files to the hard limit. On macOS it raises it to at most kern.maxfilesperproc. Systems set a low soft limit, 256 on macOS and 1024 on most Linux systems, for programs that use select(), which handles only file descriptors below 1024. Acton programs do not need it.

To run a program with a lower limit, lower the hard limit, for example with ulimit -Hn 4096. Child processes that the program starts inherit the raised limit.

Interactive debugging on crashes

If an Acton program crashes, --rts-bt-dbg is a convenient option for launching an interactive debugger. It is triggered on SIGILL / SIGSEGV and launches an interactive GDB session that allows for debugging the running program.

Acton programs do not normally crash with SIGILL / SIGSEGV but it possible either due to bugs in the compiler / RTS / builtins or more likely, for third party libraries that use C FFI, like for TLS, SSH, zlib or similar where a bug in the library triggers a crash on C level.