$machines]), 60); Util::redirect('?do=vmstore&show=benchmark&action=select&id=' . $id); } /** * @param array $machineUuids * @param string $image * @param bool $nfs * @param int $start timestamp when the clients should start * @return ?string taskId, or null on error */ public static function start(string $id, array $machineUuids, string $image, bool $nfs, int &$start) { Module::isAvailable('rebootcontrol'); $clients = Database::queryAll('SELECT machineuuid, clientip FROM machine WHERE machineuuid IN (:uuids)', ['uuids' => $machineUuids]); if (empty($clients)) { ErrorHandler::traceError('Cannot start benchmark: No matching clients'); } // The more clients we have, the longer it takes to SSH into all of them. // As of 2022, RemoteExec processes 4 clients in parallel $start = ceil(count($clients) / 4 + 5 + time()); $nfsOpt = $nfs ? '--nfs' : ''; // We fork off the benchmark into the background, and collect the results with another RemoteExec job // when we're done. This is because RemoteExec only does four concurrent SSH connections, so if we wanted to // do this the easy, synchronous way, we never could run more than four tests at the same time. $command = << /dev/null < /dev/null setsid image_speedcheck --start $start --console $nfsOpt --file "$image" > "/tmp/speedcheck-$id" ) & COMMAND; $task = RebootControl::runScript($clients, $command); return $task['id'] ?? null; } public static function parseBenchLine(string $line): array { $out = ['cpu' => [], 'net' => []]; foreach (explode(',', $line) as $elem) { $elem = explode('+', $elem); $out['net'][] = ['x' => (int)$elem[0], 'y' => (int)$elem[1]]; //$out['cpu'][] = ['x' => $elem[0], 'y' => $elem[2]]; } return $out; } }