Subversion Repositories configs

Rev

Rev 33 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 - 1
# vim: set syn=sh :
2
#
3
# This script contains functions which can be useful in ktune profile scripts.
4
#
5
 
6
#
7
# DISK tuning
8
#
9
 
10
DISKS_DEV="$(command ls -d1 /dev/[shv]d*[a-z] 2>/dev/null)"
33 - 11
DISKS_SYS="$(command ls -d1 /sys/block/{sd,cciss,dm-,vd,dasd,xvd}* 2>/dev/null)"
3 - 12
 
13
# SATA Aggressive Link Power Management
14
# usage: set_disk_alpm policy
15
set_disk_alpm() {
16
	policy=$1
17
 
18
        for host in /sys/class/scsi_host/*; do
19
                if [ -f $host/ahci_port_cmd ]; then
20
                        port_cmd=`cat $host/ahci_port_cmd`;
21
                        if [ $((0x$port_cmd & 0x240000)) = 0 -a -f $host/link_power_management_policy ]; then
22
                                echo $policy >$host/link_power_management_policy;
23
                        else
24
                                echo "max_performance" >$host/link_power_management_policy;
25
                        fi
26
                fi
27
        done
28
}
29
 
30
# usage: set_disk_apm level
31
set_disk_apm() {
32
	level=$1
33
	for disk in $DISKS_DEV; do
34
		hdparm -B $level $disk &>/dev/null
35
	done
36
}
37
 
38
# usage: set_disk_spindown level
39
set_disk_spindown() {
40
	level=$1
41
	for disk in $DISKS_DEV; do
42
		hdparm -S $level $disk &>/dev/null
43
	done
44
}
45
 
46
DISK_READAHEAD_SAVE="/var/run/tuned/disk_readahead.save"
47
 
48
# usage: multiply_disk_readahead by
49
multiply_disk_readahead() {
50
	by=$1
51
	rm -f "$DISK_READAHEAD_SAVE"
52
 
53
	# float multiplication not supported in bash
54
	# bc might not be installed, python is available for sure
55
 
56
	for disk in $DISKS_SYS; do
57
		control="${disk}/queue/read_ahead_kb"
58
		old=$(cat $control)
59
		new=$(echo "print int($old*$by)" | python)
60
		echo "echo $old > $control" >> "$DISK_READAHEAD_SAVE" 2>/dev/null
61
		(echo $new > $control) &>/dev/null
62
	done
63
}
64
 
65
restore_disk_readahead() {
66
	if [ -r "$DISK_READAHEAD_SAVE" ]; then
67
		/bin/sh "$DISK_READAHEAD_SAVE" &>/dev/null
68
		rm -f "$DISK_READAHEAD_SAVE"
69
	fi
70
}
71
 
72
# usage: remount_disk options partition1 partition2 ...
73
remount_partitions() {
74
	options=$1
75
	shift
76
 
77
	for partition in $@; do
78
		mount -o remount,$options $partition
79
	done
80
}
81
 
82
_devices_no_write_back_cache() {
83
	for device in $@; do
84
		grep -q "write back" /sys/block/"$device"/device/scsi_disk/*/cache_type 2>/dev/null && return 1
85
	done
86
	return 0
87
}
88
 
89
_disk_barriers_remount() {
90
	mount_options="$1"
91
 
92
	lsblk -lno TYPE,KNAME,MOUNTPOINT | \
93
	awk '
94
		{ type=$1; name=$2; mountpoint=$3; }
95
 
96
		(type == "disk") {
97
				device=name
98
				next
99
		}
100
 
101
		(mountpoint ~ /^\// && mountpoint != "/" && mountpoint != "/boot") {
102
			mountpoints[mountpoint] = mountpoints[mountpoint] " " device
103
		}
104
 
105
		END {
106
			for (mountpoint in mountpoints) {
107
				print mountpoint, mountpoints[mountpoint]
108
			}
109
		}
110
	' | \
111
	while read mountpoint devices; do
112
		if _devices_no_write_back_cache $devices; then
113
			mount -o remount,"$mount_options" "$mountpoint" >/dev/null 2>&1
114
		fi
115
	done
116
}
117
 
118
# remounts all non-root and non-boot partitions with nobarrier option
119
# SCSI drives with write back cache are skipped
120
disable_disk_barriers() {
121
	_disk_barriers_remount nobarrier
122
}
123
 
124
# see: disable_disk_barriers
125
enable_disk_barriers() {
126
	_disk_barriers_remount barrier
127
}
128
 
129
#
130
# CPU tuning
131
#
132
 
133
CPUSPEED_SAVE_FILE="/var/run/tuned/ktune-cpuspeed.save"
134
CPUSPEED_ORIG_GOV="/var/run/tuned/ktune-cpuspeed-governor-%s.save"
135
CPUSPEED_STARTED="/var/run/tuned/ktune-cpuspeed-started"
136
CPUSPEED_CFG="/etc/sysconfig/cpuspeed"
137
CPUSPEED_INIT="/etc/init.d/cpuspeed"
95 - 138
# do not use cpuspeed
139
CPUSPEED_USE="0"
3 - 140
CPUS="$(ls -d1 /sys/devices/system/cpu/cpu* | sed 's;^.*/;;' |  grep "cpu[0-9]\+")"
141
 
142
# set CPU governor setting and store the old settings
143
# usage: set_cpu_governor governor
144
set_cpu_governor() {
145
	governor=$1
146
 
95 - 147
	# always patch cpuspeed configuration if exists, if it doesn't exist and is enabled,
148
	# explictly disable it with hint
3 - 149
	if [ -e $CPUSPEED_INIT ]; then
150
		if [ ! -e $CPUSPEED_SAVE_FILE -a -e $CPUSPEED_CFG ]; then
151
			cp -p $CPUSPEED_CFG $CPUSPEED_SAVE_FILE
152
			sed -e 's/^GOVERNOR=.*/GOVERNOR='$governor'/g' $CPUSPEED_SAVE_FILE > $CPUSPEED_CFG
153
		fi
95 - 154
	else
155
		if [ "$CPUSPEED_USE" = "1" ]; then
156
			echo >&2
157
			echo "Suggestion: install 'cpuspeed' package to get best tuning results." >&2
158
			echo "Falling back to sysfs control." >&2
159
			echo >&2
160
		fi
3 - 161
 
95 - 162
		CPUSPEED_USE="0"
163
	fi
164
 
165
	if [ "$CPUSPEED_USE" = "1" ]; then
3 - 166
		service cpuspeed status &> /dev/null
167
		[ $? -eq 3 ] && touch $CPUSPEED_STARTED || rm -f $CPUSPEED_STARTED
168
 
169
		service cpuspeed restart &> /dev/null
170
 
95 - 171
	# direct change using sysfs
3 - 172
	elif [ -e /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ]; then
173
 
174
		for cpu in $CPUS; do
175
			gov_file=/sys/devices/system/cpu/$cpu/cpufreq/scaling_governor
176
			save_file=$(printf $CPUSPEED_ORIG_GOV $cpu)
177
			rm -f $save_file
178
			if [ -e $gov_file ]; then
179
				cat $gov_file > $save_file
180
				echo $governor > $gov_file
181
			fi
182
		done
183
	fi
184
}
185
 
186
# re-enable previous CPU governor settings
187
# usage: restore_cpu_governor
188
restore_cpu_governor() {
189
	if [ -e $CPUSPEED_INIT ]; then
190
		if [ -e $CPUSPEED_SAVE_FILE ]; then
191
			cp -fp $CPUSPEED_SAVE_FILE $CPUSPEED_CFG
192
			rm -f $CPUSPEED_SAVE_FILE
193
		fi
194
 
95 - 195
		if [ "$CPUSPEED_USE" = "1" ]; then
196
			if [ -e $CPUSPEED_STARTED ]; then
197
				service cpuspeed stop &> /dev/null
198
			else
199
				service cpuspeed restart &> /dev/null
200
			fi
201
		fi
3 - 202
		if [ -e $CPUSPEED_STARTED ]; then
203
			rm -f $CPUSPEED_STARTED
204
		fi
95 - 205
	else
206
		CPUSPEED_USE="0"
207
	fi
208
 
209
	if [ "$CPUSPEED_USE" != "1" -a -e /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ]; then
3 - 210
		for cpu in $CPUS; do
211
			cpufreq_dir=/sys/devices/system/cpu/$cpu/cpufreq
212
			save_file=$(printf $CPUSPEED_ORIG_GOV $cpu)
213
 
214
			if [ -e $cpufreq_dir/scaling_governor ]; then
215
				if [ -e $save_file ]; then
216
					cat $save_file > $cpufreq_dir/scaling_governor
217
					rm -f $save_file
218
				else
219
					echo userspace > $cpufreq_dir/scaling_governor
220
					cat $cpufreq_dir/cpuinfo_max_freq > $cpufreq_dir/scaling_setspeed
221
				fi
222
			fi
223
		done
224
	fi
225
}
226
 
227
_cpu_multicore_powersave() {
228
	value=$1
229
	[ -e /sys/devices/system/cpu/sched_mc_power_savings ] && echo $value > /sys/devices/system/cpu/sched_mc_power_savings
230
}
231
 
232
# enable multi core power savings for low wakeup systems
233
enable_cpu_multicore_powersave() {
234
	_cpu_multicore_powersave 1
235
}
236
 
237
disable_cpu_multicore_powersave() {
238
	_cpu_multicore_powersave 0
239
}
240
 
241
#
242
# MEMORY tuning
243
#
244
 
245
THP_ENABLE="/sys/kernel/mm/redhat_transparent_hugepage/enabled"
246
THP_SAVE="/var/run/tuned/ktune-thp.save"
247
 
248
[ -e "$THP_ENABLE" ] || THP_ENABLE="/sys/kernel/mm/transparent_hugepage/enabled"
249
 
250
set_transparent_hugepages() {
251
	if [ -e $THP_ENABLE ]; then
252
		cut -f2 -d'[' $THP_ENABLE  | cut -f1 -d']' > $THP_SAVE
253
		(echo "$1" > $THP_ENABLE) &> /dev/null
254
	fi
255
}
256
 
257
restore_transparent_hugepages() {
258
	if [ -e $THP_SAVE ]; then
259
		(echo $(cat $THP_SAVE) > $THP_ENABLE) &> /dev/null
260
		rm -f $THP_SAVE
261
	fi
262
}
263
 
264
#
265
# WIFI tuning
266
#
267
 
268
# usage: _wifi_set_power_level level
269
_wifi_set_power_level() {
270
	# 0    auto, PM enabled
271
	# 1-5  least savings and lowest latency - most savings and highest latency
272
	# 6    disable power savings
273
	level=$1
274
 
275
	# apply the settings using iwpriv
276
	ifaces=$(cat /proc/net/wireless | grep -v '|' | sed 's@^ *\([^:]*\):.*@\1@')
277
	for iface in $ifaces; do
278
		iwpriv $iface set_power $level
279
	done
280
 
281
	# some adapters may relay on sysfs
282
	for i in /sys/bus/pci/devices/*/power_level; do
283
		(echo $level > $i) &> /dev/null
284
	done
285
}
286
 
287
enable_wifi_powersave() {
288
	_wifi_set_power_level 5
289
}
290
 
291
disable_wifi_powersave() {
292
	_wifi_set_power_level 0
293
}
294
 
295
#
296
# BLUETOOTH tuning
297
#
298
 
299
disable_bluetooth() {
300
	hciconfig hci0 down >/dev/null 2>&1
301
	lsmod | grep -q btusb && rmmod btusb
302
}
303
 
304
enable_bluetooth() {
305
	modprobe btusb
306
	hciconfig hci0 up >/dev/null 2>&1
307
}
308
 
309
#
310
# USB tuning
311
#
312
 
313
_usb_autosuspend() {
314
	value=$1
315
	for i in /sys/bus/usb/devices/*/power/autosuspend; do echo $value > $i; done &> /dev/null
316
}
317
 
318
enable_usb_autosuspend() {
319
	_usb_autosuspend 1
320
}
321
 
322
disable_usb_autosuspend() {
323
	_usb_autosuspend 0
324
}
325
 
326
#
327
# SOUND CARDS tuning
328
#
329
 
330
_snd_ac97_powersave() {
331
	value=$1
332
	[ -e /sys/module/snd_ac97_codec/parameters/power_save ] && echo $value > /sys/module/snd_ac97_codec/parameters/power_save
333
}
334
 
335
enable_snd_ac97_powersave() {
336
	_snd_ac97_powersave Y
337
}
338
 
339
disable_snd_ac97_powersave() {
340
	_snd_ac97_powersave N
341
}
342
 
343
#
344
# CD DRIVES tuning
345
#
346
 
347
_cd_polling() {
348
	[ "$1" == "1" ] && opts=--enable-polling || opts=
349
 
350
	cddrives=$(command ls -1 /dev/scd* 2>/dev/null)
351
	for i in $cddrives; do hal-disable-polling $opts --device $(readlink -f $i); done &>/dev/null
352
}
353
 
354
enable_cd_polling() {
355
	_cd_polling 1
356
}
357
 
358
disable_cd_polling() {
359
	_cd_polling 0
360
}
361
 
362
#
363
# SOFTWARE tuning
364
#
365
 
366
RSYSLOG_CFG="/etc/rsyslog.conf"
367
RSYSLOG_SAVE="/var/run/tuned/ktune-cpuspeed.save"
368
 
369
disable_logs_syncing() {
370
	cp -p $RSYSLOG_CFG $RSYSLOG_SAVE
371
	sed -i 's/ \/var\/log/-\/var\/log/' $RSYSLOG_CFG
372
}
373
 
374
restore_logs_syncing() {
375
	mv $RSYSLOG_SAVE $RSYSLOG_CFG
376
}
377
 
378
#
379
# HARDWARE SPECIFIC tuning
380
#
381
 
382
# Asus EEE with Intel Atom
383
_eee_fsb_control() {
384
	value=$1
385
	if [ -e /sys/devices/platform/eeepc/she ]; then
386
		echo $value > /sys/devices/platform/eeepc/she
387
	elif [ -e /sys/devices/platform/eeepc/cpufv ]; then
388
		echo $value > /sys/devices/platform/eeepc/cpufv
389
	fi
390
}
391
 
392
eee_set_reduced_fsb() {
393
	_eee_fsb_control 2
394
}
395
 
396
eee_set_normal_fsb() {
397
	_eee_fsb_control 1
398
}
399
 
400
#
401
# KTUNE ACTION PROCESSING
402
#
403
 
404
error_not_implemented() {
405
	echo "tuned: ktune script function '$1' is not implemented." >&2
406
}
407
 
408
# implicit actions, will be used if not provided by profile script:
409
#
410
# * start    must be implemented
411
# * stop     must be implemented
412
# * reload   runs start
413
# * restart  runs stop + start
414
# * status   returns 0
415
 
416
start() {
417
	error_not_implemented start
418
	return 16
419
}
420
 
421
stop() {
422
	error_not_implemented stop
423
	return 16
424
}
425
 
426
reload() {
427
	start
428
	return $?
429
}
430
 
431
restart() {
432
	stop && start
433
	return $?
434
}
435
 
436
status() {
437
	return 0
438
}
439
 
440
# main processing
441
 
442
process() {
443
	VAR_SUBSYS_KTUNE="/var/lock/subsys/ktune"
95 - 444
	ARG="$1"
445
	shift
3 - 446
 
95 - 447
	case "$ARG" in
3 - 448
	start)
449
		[ -f "$VAR_SUBSYS_KTUNE" ] && exit 0
450
		start
451
		RETVAL=$?
452
		;;
453
	stop)
454
		[ -f "$VAR_SUBSYS_KTUNE" ] || exit 0
95 - 455
		stop "$@"
3 - 456
		RETVAL=$?
457
		;;
458
	reload)
459
		[ -f "$VAR_SUBSYS_KTUNE" ] && reload
460
		RETVAL=$?
461
		;;
462
	restart|force-reload)
463
		[ -f "$VAR_SUBSYS_KTUNE" ] && restart
464
		RETVAL=$?
465
		;;
466
	condrestart|try-restart)
467
		[ -f "$VAR_SUBSYS_KTUNE" ] || exit 0
468
		restart
469
		RETVAL=$?
470
		;;
471
	status)
472
		status
473
		RETVAL=$?
474
		;;
475
		*)
476
		echo $"Usage: $0 {start|stop|restart|condrestart|status}"
477
		RETVAL=2
478
		;;
479
	esac
480
 
481
	exit $RETVAL
482
}