renice_tree

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

renice_tree

Сообщение Alexander » 23.07.2025 08:50:36

При компиляции проекта из исходников (особенно на Си) тратится много времени.
Это время можно сократить, увеличив приоритет выполнения сборочной системе.
Для этой задачи и создан renice_tree.
Компиляция запускается обычным образом, затем запускается ps -AH для выяснения PID корневого процесса компиляции (обычно make).
Затем с правами рута запускается renice_tree и этим PID в качестве параметра.
Всё дерево компиляции будет иметь приоритет -20 и процесс пойдёт быстрее.

Код: Выделить всё
program renice_tree;

{
    Renice process tree. Root privileges needed. Use ps -AH for show tree.
    For GNU/Linux 64 bit version.
    Version: 1.
    Written on FreePascal (https://freepascal.org/).
    Copyright (C) 2025  Artyomov Alexander
    Used https://chatgpt.com/
    http://self-made-free.ru/
    aralni@mail.ru

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
}

{$MODE OBJFPC}{$H+}

uses
  BaseUnix, Unix, SysUtils, Classes;

function ListChildPIDs(pid: LongInt): TList;
var
  dir: TSearchRec;
  ppidStr, statFile: string;
  statF: Text;
  childPID, ppid: LongInt;
  parts: TStringList;
begin
  result := TList.Create;
  if FindFirst('/proc/*', faDirectory, dir) = 0 then
  begin
    repeat
      if (dir.Name[1] in ['0'..'9']) then
      begin
        statFile := '/proc/' + dir.Name + '/stat';
        try
          Assign(statF, statFile);
          Reset(statF);
          ReadLn(statF, ppidStr);
          Close(statF);

          parts := TStringList.Create;
          parts.Delimiter := ' ';
          parts.DelimitedText := ppidStr;
          if parts.Count >= 4 then
          begin
            ppid := StrToIntDef(parts[3], -1);
            if ppid = pid then
            begin
              childPID := StrToIntDef(dir.Name, -1);
              if childPID > 0 then
                result.Add(Pointer(childPID));
            end;
          end;
          parts.Free;
        except
          // Игнорируем ошибки, например, если процесс исчез
        end;
      end;
    until FindNext(dir) <> 0;
    FindClose(dir);
  end;
end;

procedure ReniceProcessTree(pid: LongInt);
var
  children: TList;
  i: Integer;
  childPID: LongInt;
begin
  // Сначала обработаем потомков
  children := ListChildPIDs(pid);
  for i := 0 to children.Count - 1 do
  begin
    childPID := LongInt(children[i]);
    ReniceProcessTree(childPID);
  end;
  // Затем сам процесс
  if fpSetPriority(PRIO_PROCESS, pid, -20) <> 0 then
    WriteLn('Не удалось установить приоритет для PID ', pid, ': ', fpGetErrno)
  else
    WriteLn('Установлен приоритет -20 для PID ', pid);
  children.Free;
end;

var
  targetPID: LongInt;
begin
if ParamCount >= 1 then begin
  targetPID := StrToIntDef(ParamStr(1), -1);
  if targetPID <= 0 then begin
    WriteLn('Укажите корректный PID');
    Halt(1);
  end else ReniceProcessTree(targetPID);
end;
end.
Последний раз редактировалось Alexander 24.07.2025 15:37:29, всего редактировалось 1 раз.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 835
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: renice_tree

Сообщение v-t-l » 24.07.2025 14:50:53

Код: Выделить всё
resultList: TList;
...
  ListChildPIDs := resultList;
end;

Внутри каждой функции есть неявная переменная Result возвращаемого функцией типа, содержимое которой и будет возвращено функцией. :wink:
v-t-l
энтузиаст
 
Сообщения: 742
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: renice_tree

Сообщение Alexander » 24.07.2025 15:43:54

Есть такое дело, спасибо! Поправил. Также сколько не думал, зачем ИИ поставил назначение -20 своему процессу не понял, разве что чтобы быстрее завершился. Убрал и это.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 835
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда


Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru