LINUX.ORG.RU

Проблемы с нумерацией процов

 ,


0

1

Активные ядра в системе пронумерованы не по порядку:

valkeru@valkeru-desktop:~ $ cat /sys/devices/system/cpu/online
0,3-7
valkeru@valkeru-desktop:~ $ cat /sys/devices/system/cpu/offline
1-2
Из-за этого фейлится запуск некоторых игр из стима с ошибкой ERROR - eON failed to initialise!
valkeru@valkeru-desktop:~ $ cat ~/.local/share/cdprojektred/witcher2/eon.txt
[thread ffffffff][I][18]: Log system initialised
[thread ffffffff][E][33]: eON_SystemInfo::init() - failed querying cpu count
Аналогичную проблему нашёл здесь - https://forum.manjaro.org/t/virtual-programming-eon-game-issue/25114/4, но нормального решения там не предложено, ТС решил проблему побегом с Manjaro на бубунту, но...
valkeru@valkeru-desktop:~ $ lsb_release -cr
Release:        17.04
Codename:       zesty
Судя по тому, что в предыдущих версиях такой проблемы не было - ядра там нумеровались по порядку. Как заставить систему нормально нумеровать ядра?
valkeru@valkeru-desktop:~ $ ls -l /sys/devices/system/cpu/ | grep cpu[0-9]
drwxr-xr-x 8 root root    0 июл  9 00:02 cpu0
drwxr-xr-x 8 root root    0 июл  9 00:02 cpu3
drwxr-xr-x 8 root root    0 июл  9 00:02 cpu4
drwxr-xr-x 8 root root    0 июл  9 00:02 cpu5
drwxr-xr-x 8 root root    0 июл  9 00:02 cpu6
drwxr-xr-x 8 root root    0 июл  9 00:02 cpu7
UPD: решил проблему установкой ядра 4.12.

★☆

Последнее исправление: WereFox (всего исправлений: 1)
Ответ на: комментарий от WereFox
ls -l /sys/devices/system/cpu/ | grep cpu[0-9]
drwxr-xr-x  8 root root    0 июн 22 10:59 cpu0
drwxr-xr-x  8 root root    0 июн 22 10:59 cpu1
drwxr-xr-x  8 root root    0 июн 22 10:59 cpu2
drwxr-xr-x  8 root root    0 июн 22 10:59 cpu3
drwxr-xr-x  8 root root    0 июн 22 10:59 cpu4
drwxr-xr-x  8 root root    0 июн 22 10:59 cpu5
drwxr-xr-x  8 root root    0 июн 22 10:59 cpu6
drwxr-xr-x  8 root root    0 июн 22 10:59 cpu7
steemandlinux ★★★★★
()
Ответ на: комментарий от steemandlinux

Проц 6 ядерный. Насколько я помню, часть FX-6*** - это восьмиядерники с залочеными битыми ядрами. Видимо, у меня оказался такой. Предыдущие версии бубунты нумеруют доступные как положено - от 0 до 5. Через BIOS я с этим ничего сделать не смог.

WereFox ★☆
() автор топика
Ответ на: комментарий от WereFox

Не часть, а все. Ну у тебя что-то нереальное, там битый модуль с двумя ядрами идет. Как у тебя получилось 0 3 4 5 6 7? Это же явный баг ядра или у тебя core unlock в биосе включен.

steemandlinux ★★★★★
()
Ответ на: комментарий от steemandlinux

Хз. Core unlock в биосе нет. Сброс в дефолт - результата 0

WereFox ★☆
() автор топика

А какой конкретно файл оно читает чтобы получить список ядер? Можно сделать небольшую либу, которая будет подменять содержимое, и подсунуть её через LD_PRELOAD. Должно сработать, если конечно номера ядер дальше никак не используются.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от Deleted

Вот пример...

#define _GNU_SOURCE

#include <stdarg.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <dlfcn.h>

typedef struct {
	const char *orig_path;
	const char *new_path;
} Replacement;

static const Replacement replacements[] = {
	{
		.orig_path = "/proc/cpuinfo",
		.new_path = "/tmp/cpuinfo.replacement",
	},

	{
		.orig_path = "/sys/devices/system/cpu/online",
		.new_path = "/tmp/cpu-online.replacement",
	},

	{
		.orig_path = NULL,
	       	.new_path = NULL,
	},
};

typedef int (* OpenFn)(const char *pathname, int flags, ...);

int open(const char *pathname, int flags, ...)
{
	OpenFn real_open_fn = dlsym(RTLD_NEXT, "open");

	mode_t mode = 0;
	bool have_mode = false;
	va_list ap;
	va_start(ap, flags);
	if ((flags & O_CREAT) || (flags & O_TMPFILE)) {
		mode = va_arg(ap, mode_t);
		have_mode = true;
	}
	va_end(ap);

	const char *new_path = pathname;
	char *orig_path = realpath(pathname, NULL);
	if (orig_path) {
		for (const Replacement *replacement = replacements; replacement->orig_path; ++replacement) {
			if (!strcmp(orig_path, replacement->orig_path)) {
				new_path = replacement->new_path;
				break;
			}
		}
		free(orig_path);
	}

	if (have_mode) {
		return real_open_fn(new_path, flags, mode);
	} else {
		return real_open_fn(new_path, flags);
	}
}

Собрать:

gcc -std=c11 -Wall -Wextra -fPIC -shared -ldl -o replace-open-file.so replace-open-file.c
Тест:
$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 78
model name      : Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz
stepping        : 3
...

$ cat /sys/devices/system/cpu/online
0-3

$ LD_PRELOAD=./replace-open-file.so cat /proc/cpuinfo
Процессоры не найдены

$ LD_PRELOAD=./replace-open-file.so cat /sys/devices/system/cpu/online
Ты наркоман? Нет тут процессоров!

Если для подсчёта ядер используется что-то другое, то можно выяснить и так же подменить. Если номера ядер как-то используются, то всё сложнее, но тоже теоретически можно подхачить.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от steemandlinux

баг ядра

Видимо, да. Собрал ванильное 4.12 - всё работает как положено.

WereFox ★☆
() автор топика
Ответ на: Вот пример... от Deleted

Спасибо, решил проблему установкой свежего ядра.

WereFox ★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.