but sometimes it's interesting to check how a software would heave on a different system, which is not at hand right now.
On Linux, a lot of information about the current system can be found in /proc and /sys.
These filesystems are virtual, so they can not changed easily with an editor.
In my case I want to simulate a lot more CPUs.
These are visible in several locations.
The most know is probably /proc/cpuinfo. There you find a block of information for each CPU the kernel knows about. Based on the current configuration, I create a modified fake file somewhere in a different space:
#!/bin/bash # cpus.sh count=0 max_socket=8 max_core=32 END=5 for ((soc=0;soc<max_socket;soc++)); do for (( cor=0;cor<max_core;cor++)); do echo "processor : $count vendor_id : GenuineIntel cpu family : 6 model : 37 model name : Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz stepping : 1 microcode : 0x3b cpu MHz : 2596.103 cache size : 25600 KB physical id : $soc siblings : $max_core core id : $cor cpu cores : $max_core apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes hypervisor lahf_lm ida arat epb pln pts dtherm pti tsc_adjust bugs : cpu_meltdown spectre_v2 bogomips : 5193.98 clflush size : 64 cache_alignment : 64 address sizes : 42 bits physical, 48 bits virtual power management: " let count=count+1 done doneand create a file with ./cpus.sh>cpuinfo.256
There is another location as well: /sys/devices/system/cpu.
In this directory are several directories and files with interesting information.
I copy the fill directory to another place (ignoring all the errors).
First the number of cpu[id] directories might need adjustment.
In my case a simple set of symlinks is sufficient:
for i in {2..255} ; do echo $i ln -s cpu1 cpu${i} doneIn every cpu[id] durectory there is a symlinik to which node it belongs: node0 -> ../../node/node0
So it might be required to spoof proper entries in /sys/devices/system/node. In my case it's not required.
The last fix required in my case is in the file cpu/online.
It contains 0-255 now (instead of 0-2).
As I mentioned above the original files can not be manipulated as they are not real files.
The mount option --bind does the trick:
mount --bind <my_working_dir>/cpuinfo.256 /proc/cpuinfo mount --bind <my_working_dir>/cpu /sys/devices/system/cpu
After these nice manipulations, my sandbox Oracle instance shows now plenty of CPUs:
SQL> show parameter cpu_count NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ cpu_count integer 256
Update (2018-03-21):
For Oracle Databases I got 2 hints how to make it calculate with more CPUs than really available.
Another solution as sugested by Feng in the comment section here https://t.co/jIErDaiaxF is to fake skgpnumcpu return value— Hatem Mahmoud (@Hatem__Mahmoud) March 20, 2018
with this small stap script:
#!/usr/bin/stap function modify_rax() %{ long ret; ret = 6; memcpy( ((char *)CONTEXT->uregs) + 80 , &ret, sizeof(ret)); %} probe process(“oracle”).function(“skgpnumcpu”).return { modify_rax(); }
and
Try setting _disable_cpu_check = true— Jonathan Lewis (@JLOracle) March 20, 2018
May be version dependent - works in 12.1.0.2, can't remember which other versions I've tried.
Keine Kommentare:
Kommentar veröffentlichen