系统环境:台式机,Ubuntu 12.04 64位桌面版,网卡eth0闲置,平时使用网卡eth1.
网络环境:通过DHCP动态获取ipv4地址,自动获取ipv6地址。
每次打开Transmission通过ipv6下载PT时,进程network-manager的CPU占用率都会飙到百分之九十多。
我的解决方法就是:放弃采用NetworkManager来管理网络设置,而使用传统的/etc/network/interfaces
文件来管理网络设置。实际上,服务器版的Linux系统都是采用这种方式的,NetworkManager只有桌面版的Ubuntu系统才有。
编辑/etc/NetworkManager/NetworkManager.conf
1 | $ sudo vim /etc/NetworkManager/NetworkManager.conf
|
将managed=true
改为managed=false
,然后重启NetworkManager服务
1 | $ sudo service network-manager restart
|
如果我们将managed
设为true
时,NetworkManager会接管所有网路设备的设定,而忽略/etc/network/interfaces
的内容。
/etc/network/interfaces
此文件原始状态只有以下行:
1 2 3 | # /etc/network/interfaces
auto lo
iface lo inet loopback
|
关于lo的这两行设定是必要的,请勿删除。删掉的话,系统将不具备 127.0.0.1 (localhost) 的网路介面。
挂起网卡eth0:
1 | allow-hotplug eth0 |
动态获取ipv4地址:
1 2 | auto eth1 iface eth1 inet dhcp |
自动获取ipv6地址的方式:
1 | iface eth1 inet6 auto |
采用静态ipv6地址的方式:
1 2 3 4 | iface eth1 inet6 static
address your_ipv6_address
netmask 64
up route -A inet6 add default gw your_ipv6_gateway dev $IFACE
|
每次修改过interfaces文件,都要运行以下命令重载设置才能生效。
1 | $ sudo service networking restart
|
此后,NetworkManager不会再占用CPU资源了。
Ubuntu默认对ipv6启用了privacy extension.
1 | $ sudo vim /etc/sysctl.d/10-ipv6-privacy.conf
|
在这个文件中,你会看到下面两行:
1 2 | net.ipv6.conf.all.use_tempaddr = 2 net.ipv6.conf.default.use_tempaddr = 2 |
看看你的ipv6地址,你会发现一些有趣的东西。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $ ip addr show
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP ql en 1000
link/ether 00:05:06:07:08:09 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 198.168.1.255 scope global eth0
inet6 2789:1234:cdef:9876:395e:c9fd:78b4:d863/64 scope global temporary dynamic
valid_lft 604349sec preferred_lft 85349sec
inet6 2789:1234:cdef:9876:205:06ff:fe07:0809/64 scope global dynamic
valid_lft 2591921sec preferred_lft 604721sec
inet6 fe80::205:06ff:fe07:0809/64 scope link
valid_lft forever preferred_lft forever
|
对于网卡eth0,你会发现有两个scope global的ipv6地址:"scope global temporary dynamic" 和 "scope global dynamic".
这两个地址都是有生命期的,在"preferred_lft"这么多秒之后,它们就会被新的地址所取代。
如果,我们在文件/etc/sysctl.d/10-ipv6-privacy.conf
中取值2,那么那个"temporary"地址就会被用于对外连接。如果取1,就不会;如果取0,就完全禁用privacy extension.
每次修改完此文件,需运行以下命令使设置生效:
1 | $ sudo service procps restart
|
此命令如果不起作用,可试试
1 | $ sudo sysctl -p
|
编辑以下文件
1 | $ sudo vim /etc/sysctl.conf
|
添加以下三行
1 2 3 | net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 |
重启procps服务
1 2 | $ sudo service procps restart $ sudo sysctl -p |
如果,还不起作用,可能就要重启系统了。
本作品由 Yysfire 创作,采用进行许可。转载时请在显著位置标明本文永久链接:
http://yysfire.github.io/linux/networkmanager-occupy-cpu-substantially.html