레이블이 sysctl인 게시물을 표시합니다. 모든 게시물 표시
레이블이 sysctl인 게시물을 표시합니다. 모든 게시물 표시

mac wifi 속도 느려짐

macOS Mojave 10.14.2  사용중인데, 이상하게 wifi 속도가 느려지는 이슈가 있다.
맥을 리부팅하면 200 Mbit/s 이상의 속도가 나오다 어느정도 시간이 지나면
100 MBit/s
10 MBits/s
5 MBit/s
로 계속 떨어지고 결국에는 인터넷 서핑을 하기 힘들정도가 된다.

airport(wi-fi) 상태 정보를 확인해보면

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I

RSSI(Received Signal Strength Indicator) 는 수신강도로 음수로 표시되며 값이 높을수록(0에 가까울수록) 감도가 좋다. -80  보다 크면 양호

예) -60 이 -80 보다 수신강도가 좋다.

36 채널은 5GHz를 사용한다.
참고 https://en.wikipedia.org/wiki/List_of_WLAN_channels

     agrCtlRSSI: -60
     agrExtRSSI: 0
    agrCtlNoise: -96
    agrExtNoise: 0
          state: running
        op mode: station
     lastTxRate: 540
        maxRate: 600
lastAssocStatus: 0
    802.11 auth: open
      link auth: wpa2
          BSSID: x:xx:xx:xx:xx:xx
           SSID: ysoftman_wifi
            MCS: 0
        channel: 36,1

option 키를 누른상태에서 wifi 아이콘 클릭해 세부정보를 보면
5GHz, 802.11ac, 400Mbps로 정상적으로 보인다.


그런데 network utility.app 으로 wifi 보면 링크 속도가 낮게 보인다.


다음 명령으로 링크속도가 어떻게 설정되어 있는지 확인해보면 자동설정이라고 되어 있다.
ifconfig en0 | grep media
media: autoselect

같은 네트워크에서 갤럭시폰 링크 속도(전화에서 *123456# -> wifi 선택하면 보인다.)는 1Gbps 를 지원하는 802.11ac 네트워크로 실제 400Mbps 이다.


cron 으로 speedtest 매시간 돌려본 결과다.
맥북을 리부팅하면 속도가 잘 나오지만 시간이 갈수록 속도가 떨어진다.
Mon Jan 28 13:00:00 KST 2019 13:00  up  1:53, 3 users, load averages: 3.34 2.87 2.52 Download: 270.22 Mbit/s
Mon Jan 28 14:00:00 KST 2019 14:00  up  2:53, 4 users, load averages: 1.79 1.83 1.80 Download: 102.31 Mbit/s
Mon Jan 28 15:00:00 KST 2019 15:00  up  3:53, 3 users, load averages: 1.41 1.61 1.69 Download: 128.40 Mbit/s
Mon Jan 28 16:00:00 KST 2019 16:00  up  4:53, 4 users, load averages: 2.38 2.01 1.88 Download: 94.41 Mbit/s
... 생략 ...
Thu Feb  7 07:00:00 KST 2019 7:00  up 7 days, 18:01, 3 users, load averages: 1.45 1.57 1.59 Download: 1.77 Mbit/s
Thu Feb  7 08:00:00 KST 2019 8:00  up 7 days, 19:01, 3 users, load averages: 1.59 1.57 1.55 Download: 0.42 Mbit/s

wifi 는 최신 암호화 방식인 WPA2PSK-AES 를 사용해야 한다.
AES 를 뺀 나머지(WEP64, WEP128, TKIP)는 모두 금방 해킹된다.
https://www.bodnara.co.kr/bbs/article.html?num=106786

그리고 TKIP 사용하면 속도도 54Mbps 로 제한된다.
https://www.intel.co.kr/content/www/kr/ko/support/articles/000006697/network-and-i-o/wireless-networking.html

하지만 기업용 WPA2보안은 기본 AES암호화를 사용해 속도는 잘나와야 한다.
나와 같은 문제를 격어 apple 문의한 사람이 있는데, 아직 답이 없다.
https://discussions.apple.com/thread/8562488

wifi explorer lite 앱으로 주파수 상태를 양호한 편으로 큰 문제는 없는것 같다.


[시도1]
아무리 찾아봐도 특별한 원인은 찾을 수 없었는데, 사용자 위치 정보 wifi 설정으로 나아졌다는 글을 보고 설정을 변경해봤다.

참고로 저렇게 설정을 꺼두면 wifi 로 내위치를 확인하지 못한다.

시스템 환경 설정 -> 보안 및 개인정보 보호 -> 위치 서비스 -> 시스템 서비스 -> 세부사항 -> Wi-Fi  네트워크 비활성화 후 wifi 를 끄고 다시 시작한다.


위 설정후 처음에는 속도가 높았지만 점점 속도가 느려서 해결책이 되지 못했다.

[시도2]
다음 위치의 네트웍 관련 설정 파일들을 삭제하고 재부팅한다.
cd /Library/Preferences/SystemConfiguration
sudo rm -f
NetworkInterfaces.plist
com.apple.airport.preferences.plist
com.apple.wifi.message-tracer.plist
preferences.plist

하루정도 지나면 여전히 속도가 느려진다.

[시도3]
sysctl.conf 의 네트워크 관련 설정을 해보자.
https://rolande.wordpress.com/2010/12/30/performance-tuning-the-network-stack-on-mac-osx-10-6/
http://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/netperf/tuning-tcp.shtml#osx

현재 커널 tcp 설정 확인해 보면 send/recv 메모리 최대가 2MiB로 너무 작게 설정되어 있다. 참고로 리눅스와 sysctl 변수 이름과 다르다.
sysctl -a | grep -E "nmbclusters|maxsockbuf|tcp.*space|tcp.auto|tcp.win"
kern.ipc.maxsockbuf: 8388608
kern.ipc.nmbclusters: 65536
net.inet.tcp.sendspace: 131072
net.inet.tcp.recvspace: 131072
net.inet.tcp.autorcvbufmax: 2097152
net.inet.tcp.autosndbufinc: 8192
net.inet.tcp.autosndbufmax: 2097152
net.inet.tcp.win_scale_factor: 3

nmbclusters 는 네트워크에 사용되는 버퍼(메모리) 클러스터로 클러스터 1개가 약 2KiB 를 차지한다.

64MiB 를 메모리를 사용하려면 (1024*1024*64)/(1024*2) = 32768 개를 설정한다.

위 설정을 보면 이미 65536 으로 128MiB 로 설정되어 있다.
참고 https://wiki.freebsd.org/SystemTuning

nmbclusters 는 바로 적용할 수 없어 /etc/sysctl.conf 에서 수정해야 한다.
maxsockbuf 는 nmbclusters 이상 넘을 수 없다.

다음과 같이 64MiB 로 늘리려고 하면 다음과 같이 에러가 발생한다.

sudo sysctl -w kern.ipc.maxsockbuf=67108864
sysctl: kern.ipc.maxsockbuf=33554432: Result too large

sendspace, recvspace 은 maxsockbuf 이상 넘을 수 없다.

sudo sysctl -w net.inet.tcp.sendspace=4194304
sudo sysctl -w net.inet.tcp.recvspace=4194304

32MiB=33554432 또는 64MiB=67108864

sudo sysctl -w net.inet.tcp.autorcvbufmax=67108864
sudo sysctl -w net.inet.tcp.autosndbufmax=67108864

win_scale_factor(윈도우 크기 배수)도 최근 8배까지 지원되니 바꿔준다.
sudo sysctl -w net.inet.tcp.win_scale_factor=8

win_scale_factor rfc1323(TCP high performace) 스펙 추가사항이라

다음과 같이 활성화 해야 되지만 mojave 에선 더이상 설정할 수 없는것 같다.
sudo sysctl -w net.inet.tcp.rfc1323=1
sysctl: unknown oid 'net.inet.tcp.rfc1323'

위 내용 정리해서, sysctl -w 은 shutdown 하면 사라지기 때문에 /etc/sysctl.conf 를 수정하자.
kern.ipc.nmbclusters=65536
kern.ipc.maxsockbuf=67108864
net.inet.tcp.sendspace=4194304
net.inet.tcp.recvspace=4194304
net.inet.tcp.autorcvbufmax=67108864
net.inet.tcp.autosndbufmax=67108864
net.inet.tcp.win_scale_factor=8

참고로 netstat -m 으로 네트워크 메모리 사용현황을 파악할 수 있는데, 속도가 100Mbps 정도 나왔을때 다음과 같이 25% 정도를 네트워크에 사용하고 있다.
watch -n 1 'netstat -m'
814/1883 mbufs in use:
812 mbufs allocated to data
2 mbufs allocated to packet tags
1069 mbufs allocated to caches
787/1912 mbuf 2KB clusters in use
0/645 mbuf 4KB clusters in use
0/0 mbuf 16KB clusters in use
7156 KB allocated to network (24.8% in use)
0 KB returned to the system
0 requests for memory denied
0 requests for memory delayed
0 calls to drain routines

하루정도 지나면 여전히 속도가 느려진다.

[시도4]
블루투스가 영향이 있을까 해서 블루투스 비활성화 해봤지만 영향이 없음

[시도5]
wifi 및 시스템 전체 로깅을 실시간으로 볼 수 있다.

커널쪽에서 메시지만 골라 보면
log stream | grep kernel

다음과 같은 메시지가 주기적으로 나타난다.
kernel: (PulseSecureFirewall) PulseSecureDriver - IpPacketCookiesManager.cpp:226 - INFO Deleting expired cookies

pulse app 종료를 해도 계속 나타나  pulse app 을 지웠다.
지금까지는 꼭 재부팅을 해야 네트워크 속도가 올라갔는데, wifi만 끄고 켰는데 속도가 꽤 올라간다.
흠, 몇일 지켜봤는데 속도 저하는 발생하지 않고 있다.
pulse 9.0.2 버전에서 발생했고 이슈를 회사에 전달했고, 문제가 해결된 pulse 9.1 이상을 사용하고 있다.

참고로 pulse 를 완전 제거 후 장시간 맥북을 켜두면 wifi 속도가 현저하게 떨어지지 않지만 2~30mbps 정도로 유지되는 경우 wifi 를 컸다키면 다시 속도가 100mbps 이상으로 올라간다.

네트워크 관련 sysctl

# 연결 지향 tcp 는 데이터를 주고 받기전 우선 연결된다.
# 리슨을 위해 바인딩된 포트 열어 놓는 쪽은 passive open으로 서버가 되고,
# 연결을 요청하는 쪽은 active open으로 클라가 된다.
# tcp 종료 과정은 다음과 같다.
# 그림 출처 : 위키피디아 https://en.wikipedia.org/wiki/Transmission_Control_Protocol


# sysctl 은 런타임시에 커널의 파리미터를 설정하는 명령어다.
# /etc/sysctl.conf 파일로도 설정할 수 있다.
# /proc/sys/net/ipv4 에 파일 수정으로 설정할 수 있다.
https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
http://lxr.linux.no/linux+v3.2.8/Documentation/networking/ip-sysctl.txt
# 이중 net.ipv4 로 시작하는 tcp 제어 설정에서 중요한 몇개를 살펴 보자.

# 로컬 포트가 고갈되는 경우
# TIME_WAIT(fin을 받고 서버에 ack 보내고 일정 시간 기다리는 상태)의 소켓들을 재사용할지 여부
# 0 : 비활성화
# 1 : 활성화 (보통 1로 사용)
# 2 : loopback 에서만 활성화
net.ipv4.tcp_tw_reuse = 1

# FIN_WAIT_2(서버쪽 close 중임을 클라에게 알리는 ack 를 받았을때의 클라 상태)이후
# last_ack 를 받지 못했을때 대기시간으로 디폴트 60초이다.
# 참고로 TIME_WAIT 의 타임아웃은 커널소스에 60초로 하드 코딩되어 있다.
# /usr/src/kernels/3.10.0-957.1.3.el7.x86_64.debug/include/net/tcp.h
# #define TCP_TIMEWAIT_LEN (60*HZ)
net.ipv4.tcp_fin_timeout = 60

# 로컬 포트 사용(허용) 범위
net.ipv4.ip_local_port_range = 23768 60999

# tcp_tw_use 처럼 TIME_WAIT 상태의 소켓을 재사용(recycle)할지 여부
# 디폴트는 비활성화
# 여러 문제가 발생될 소지가 있어 최근 리눅스 4.12 에서는 제거되었다고 한다.
https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux
net.ipv4.tcp_tw_recycle = 0

apache httpd core dump 생성하기

# apache httpd 프로세스에 크래시되면 core dump 파일 생성하기
# httpd.conf 수정
vi httpd.conf
CoreDumpDirectory  /ysoftman

# core dump 디렉토리 권한 주기
chmod 0777 /ysoftman

# core 덤프 사이즈 제한 없애기
# limits.conf 파일 수정 (시스템 rebooting 필요)
sudo vi /etc/security/limits.conf
* soft core unlimited

# 또는 .basrhc 또는 .zsrhc 에 추가
ulimit -c unlimited

# core unlimited 확인
ulimit -a

# sysctl 설정 확인
sudo sysctl -a | grep kernel.core

# core 파일명에 pid 명시되도록 설정
sudo sysctl kernel.core_uses_pid=1

# core 기본 파일이름
sudo sysctl kernel.core_pattern=core

# docker container 의 경우 다음과 같이 읽기 전용 파일이라고 에러가 발생한다.
sysctl: setting key "kernel.core_uses_pid": Read-only file system

# docker container 에서는 sysctl 로 확인만 가능하다.
# 다음과 같이 /etc/sysctl.conf 파일에 명시해야 한다.
RUN echo 'kernel.core_uses_pid = 1' >> /etc/sysctl.conf

# docker run --sysctl 옵션은 사용할 수 있지만
# docker run --sysctl kernel.core_uses_pid=1 사용하면 다음 에러가 난다.
# kernel* 부분들을 run 시 설정할 수 없는것 같다.
invalid argument "kernel.core_uses_pid=1" for "--sysctl" flag: sysctl 'kernel.core_uses_pid=1' is not whitelisted

# httpd 재시작
bin/apachectl stop
bin/apachectl start

# httpd process 에 SEGV(segmentation fault) signal 주어 코어 파일 생성
kill -11 123456

# 참고
https://www.kernel.org/doc/Documentation/sysctl/kernel.txt
https://www.centos.org/forums/viewtopic.php?t=44865
https://docs.docker.com/engine/reference/commandline/run/#configure-namespaced-kernel-parameters-sysctls-at-runtime
https://github.com/moby/moby/issues/7040

sysctl 설정하기

# /etc/sysctl.conf 에 커널 설정값을 명시한다.

# [네트워크]
# 속도 즉 대역폭이 왜 낮을까 해서 찾아보니
https://www.speedguide.net/faq/what-is-the-bandwidth-delay-product-185
# BDP(Bandwidth Delay Product)는 네트워크에 있는 데이터 총량으로
# BDP = Bandwith * Delay(RTT) 가 되며
# Bandwidth = BDP / Delay 가 된다.
# Delay, 즉 RTT 는 물리적 환경에 따라 고정되는 값이기 때문에,
# 우리가 할 수 있는건 BDP 를 제어하는 것이다.
# BDP 는 결국 네트워크에 존재하는 데이터를 크기로,
# 커널 네트워크관련 read/write buffer 로 조정할 수 있다.

# 현재 커널 네트워크 설정을 확인해보자.
sysctl -a | grep -E "net.core|net.ipv4.tcp"

# /etc/sysctl.conf 내용을 수정해 보자.
# http://man7.org/linux/man-pages/man7/tcp.7.html
# http://www.linuxlab.co.kr/docs/kernel/a2547.html
# https://klaver.it/linux/sysctl.conf
# 네트워크 코어(공통) 설정들
# read(receive), write(send) 최대 버퍼 32MiB 로 설정
# read(receive), write(send) 기본 버퍼 16MiB 로 설정
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216

# tcp4 설정들, low / pressure / high 순서로 설정
# tcp read(receive) 버퍼 4KiB 87380Bytes 16MiB
# tcp write(send) 버퍼 4KiB 64KiB 16MiB
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# tcp4 에 사용할 수 있는 메모리 크기로
# 기본적으로 부팅할때 가능한 시스템 메모리양으로 계산되어 되도록이면 그냥 둔다.
# low / pressure / high 로 bytes 가 아닌 page 단위다.
# getconf PAGESIZE 로 페이지 크기를 보면 보통 4096 바이트다.
net.ipv4.tcp_mem = 4096 4096 4096

# receiver windows size 기본 64KiB 인데
# tcp 옵션 헤더로 window scale factor(wsf) 설정하면
# 64KiB * 2^wsf 크기로 window size 를 확장할 수있다.
https://en.wikipedia.org/wiki/TCP_window_scale_option
# 이를 가능하기 위해선 tcp_window_scaling 을 활성화 해야 한다.
# rfc1323 스펙에 추가된 사항으로 rfc1323 도 활성화 해야 한다.
# 보통 디폴트로 다음과 같이 활성화되어 있다.
net.inet.tcp.rfc1323 = 1
net.ipv4.tcp_window_scaling = 1

# 네트워크 메모리 사용량 확인
netstat -m

Linux 시스템 다양한 정보 보기, 성능 분석

# 시스템 정보 보기 (호스트네임,커널,프로세서,OS,..etc)
uname -a

# linux 이름 및 버전 정보 보기
vi /etc/issue

# 또는
cat /etc/*-release

# 사용자 리스트
vi /etc/passwd

# CPU 정보
vi /proc/cpuinfo

# memory 정보
vi /proc/meminfo

# 또는
# -m MB 로 표시, -g GB 로 표시,...etc
free -m

# 또는
# virtual memory 상태 -w wide
vmstat -w

# 또는
# -s status -S m MB 로 표시
vmstat -s -S m

# vmstat,mpstat,sar 설치
yum install sysstat

# memory 사용률 1초마다 갱신해서 5번까지 보기
vmstat 1 5

# 시스템 성능 통계
# cpu 사용률 1초마다 갱신해서 5번까지 보기
sar 1 5

# process 사용률 1초마다 갱신해서 5번까지 보기
mpstat 1 5

# Disk 별 uuid 정보
ls -ahl /dev/disk/by-uuid/

# Disk 사용량 보기
df -h

# 부팅 후 운용시간 보기
uptime

# dns 서버 설정
vi /etc/resolv.conf

# host 커스텀 설정
vi /etc/hosts

# hostname 보기
cat /proc/sys/kernel/hostname

# 시스템 정보
sudo dmidecode -t system

# 메모리 정보
sudo dmidecode -t memory

# 바이오스 정보
sudo dmidecode -t bios

# 소켓 간단한 상태 보기
cat /proc/net/sockstat

# 소케 메모리 사용량 확인
netstat -m

# 소켓 사용 현황 보기
# -n(numberic ip 로 표현, 도메인 리졸브 안함)
# -a(all)
# -t(tcp)
netstat -nat

# 또는
ss -nat

# 도메인 ip 보기
nslookup google.com

# 또는(좀더 자세하다.)
dig google.com

# 패킷 라우팅 보기
traceroute google.com

# 포트 범위
sysctl net.ipv4.ip_local_port_range

# 또는
cat /proc/sys/net/ipv4/ip_local_port_range

# tcp 관련 설정 정보
sysctl -a | grep net.ipv4.tcp

# 프로세스가 사용하는 시스템 콜 api 보기
sudo yum install strace
strace 명령어

# 예) ls 명령에서 open 시스템 콜만 골라 보기
strace -e trace=open ls

# 예) 실행중인 프레스 attach 해서, 결과 파일로 쓰기
strace -p 프로세스id -o zzz.strace

# 열린 파일 리스트
sudo yum install lsof
lsof

# 1234 포트 사용중인 파일 리스트
# 해당 PID 를 파악할 수 있다.
lsof -i :1234

# rsync 커맨드가 사용중인 파일 리스트
lsof -c rsync

# io 트랙픽 보기
sudo yum install iotop
sudo iotop

# network 트래픽 보기
# -i  eth0 으로 특정 네트워크 인터페이스를 지정할 수 있다.
sudo yum install iftop
iftop

# 시스템 부팅 시 메시지
dmesg -e

# 에러, startup, shutdown 등의 각종 시스템 이벤트 로그
sudo vi /var/log/messages


#####


# mac 참고
# 모든 정보
sysctl -a

# cpu 브랜드 이름
sysctl -a | grep cpu.brand_string

# cpu 개수
sysctl -n hw.ncpu

# 메모리 크기
sysctl -n hw.memsize

# 메모리 사용량 1초마다 보기
vm_stat  1

# 컴퓨터 이름 보기
networksetup -getcomputername

# 컴퓨터 이름 설정
networksetup -setcomputername "ysoftman macbook pro"

# 사용 가능한 네트워크 종류 보기
networksetup -listallnetworkservices

# 연결중인 네트워크 리스트
networksetup -listallhardwareports

# wi-fi(listallnetworkservices 중하나) 정보
networksetup -getinfo wi-fi

# en0(보통 wi-fi) 끄기
networksetup -setairportpower en0 off

# en0(보통 wi-fi) 켜기
networksetup -setairportpower en0 on

# airport(wi-fi) 상태 정보
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I

# 시스템 자세한 정보
system_profiler

# 시스템 자세한 정보(app)
spotlight -> 시스템 정보.app(또는 system profiler 로 실행)

# 시스템 메시지(로그)
# mac 에선 dmesg 로 부팅 로그 전체를 볼 수 없어 log 를 사용하는것이 좋다.
# log 는 dmesg 를 포함한 시스템 로그를 취합해 보여준다.
# start 날짜 이후의 시스템 메시지
log show --start "2010-02-19"

# 실시간 시스템 로그 보기
log stream

# 로그 전체 삭제
sudo log erase --all

# 시스템 로그 파일
vi /var/log/system.log

# 참고 리눅스에서 상황/대상별에 맞는 분석/성능 툴
http://www.joyent.com/blog/linux-performance-analysis-and-tools-brendan-gregg-s-talk-at-scale-11x