[문제해결] Can’t create/write to file ‘/mysql/tmp/ibSAi4kh’ (Errcode: 28 – No space left on device) 2016-07-04

1. 문제상황

> 여러 사이트를 운영중인 서버에서 mysql이 stop 되어 start를 시도 하였으나 다음과 같은 에러가 발생하며 시작되지 않았다.

제목 없음

Can't create/write to file '--/mysql/tmp/ibSAi4kh' (Errcode: 28 - No space left on device)
InnoDB: Error: unable to create temporary file; errno: 28
InnoDB: Assertion failure in thread 140119057037088 in file lock0lock.cc line 620

2. 문제확인

> 임시파일을 생성할 수 없다는 에러 문구로 보아 디스크 용량 부족을 체크하였다.

> df
Filesystem           1K-blocks     Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root
                      15971272  8504680   6648624  57% /
tmpfs                   508116        0    508116   0% /dev/shm
/dev/xvda1              487652    48917    413135  11% /boot
/dev/xvdb             82438832 22826180  55418348  30% /data

디스크 용량은 문제가 없어보인다.
> Inodes 를 체크하였다.

> df -i
Filesystem            Inodes  IUsed   IFree IUse% Mounted on
/dev/mapper/VolGroup-lv_root
                     1024000 1023999  1   100% /
tmpfs                 127029      1  127028    1% /dev/shm
/dev/xvda1            128016     44  127972    1% /boot
/dev/xvdb            5242880    257 5242623    1% /data

IUse% 가 100%가 되어 “No space left on device”에러가 발생한 것으로 보인다.
inode는 파일마다 하나씩 부여되는데 가득차서 더이상 파일을 생성할 수 없게 된다. 그렇다면 1024000라는 크기만큼 파일이 생성된듯 하다.

시스템에서 이정도로 많은 파일을 생성하지는 않을 듯하여 서비스 중인 폴더를 체크하였다.

> for i in /*; do echo $i; find $i |wc -l; done
/bin
92
/boot
35
/data
248
/dev
564
/etc
1353
/home
899792
/lib
6235
/lib64
490
/lost+found
1
/media
1
/mnt
1
/opt
3925
/proc
35597
/root
27
/sbin
232
/selinux
1
/_Service
268
/srv
1
/sys
4257
/tmp
775
/usr
50693
/var
4580

home폴더의 파일갯수가 무려 899792 나 된다.
하위 폴더를 검색하자

> for i in /home/*; do echo $i; find $i |wc -l; done
...

대체적으로 간단한 홈페이지를 만들기위해 사용된 그누보드에서 파일갯수가 많다. 아마도 세션파일이나 캐싱 파일로 짐작된다.
하위 폴더에서 확인결과 그누보드의 /data/session폴더에 파일 갯수가 엄청났다.


3. 문제해결

> 세션파일의 경우 현재 필요한 세션이 아닌것이 대부분이다. 주기적인 삭제가 필요하다. 일단 mysql 서비스를 실행하기 위해 rm 명령으로 삭제하자.

> rm -rf --/session/*

제목 없음2
> -bash: /bin/rm: Argument list too long 라는 에러가 발생한다. 파일 갯수가 너무많아 한번에 삭제가 불가능한 것이다.

> rm -rf --/session/sess_0*
> rm -rf --/session/sess_1*
> rm -rf --/session/sess_2*
> rm -rf --/session/sess_3*
...

> ls로 파일명을 확인하여 패턴에 따라 삭제하였다.
> 파일을 삭제하니 정상적으로 mysql이 구동되었다.

제목 없음3

> 세션 파일을 주기적으로 삭제하기 위해 스크립트 파일을 만들어 cron에 등록하도록 하자.

[C++ 정리] 배열(Array)과 연결리스트(Linked List) 2015-06-18

배열 : 정해진 크기만큼만 선언을 할 수 있다. 이는 연결된 메모리를 보장해준다. 하지만 이는 유연하게 프로그래밍을 하는데는 제약이 있다.

array
장점

* 구현이 간단하다.
* 연결된 메모리상에 존재하므로 중간 데이터에 빠르게 접근할 수 있다. 
  ex> array[3] 으로 'D'에 접근할 수 있다.

단점

* 크기를 고정해야 하기 때문에 사용될 것을 고려하여 할당해야 하고 이는 불필요한 메모리를 차지한다.
* 중간 데이터의 삽입 또는 삭제가 일어난다면 뒤에 데이터를 전부 변경해야만(메모리상에서 한칸씩 밀거나 당긴다) 하기 때문에 비효율적이다.

연결리스트 : 크기에 대한 제약없어 유연하게 활용할 수 있지만 연결된 메모리가 아니기 때문에 데이터를 찾기 위해서는 모든 노드를 거쳐서 탐색해야 한다.

linkedlist
장점

* 필요할때마다 메모리를 동적으로 할당하기 때문에 메모리 효율적이다.
* 중간에 데이터를 삽입 또는 삭제 하더라도 다른 데이터에 영향을 주지 않아 효율적이다.
  Ex> 'D'를 삭제하려면 'C'에서의 링크를 'E'로 변경만 하면 된다.

단점

* 구현이 복잡하다.
* 중간의 데이터에 접근하기 위해서는 이전 노드를 모두 거쳐야만 접근할 수 있다.
  Ex> 'D'에 접근하려면 'B', 'C'를 거쳐야만 한다.

연결리스트의 종류

> 단일 연결 리스트(Singly Linked List)

singlylinkedlist

typedef struct node
{
    struct node* next;
    void* data;
}Node;
* 노드가 다음노드를 가리킨다.
> 이중 연결 리스트(Doubly Linked List)

doublylinkedlist

typedef struct node
{
    struct node* prev;
    struct node* next;
    void* data;
}Node;
* 각 노드들이 이전과 다음노드를 가리킨다.
> 다중 연결 리스트(Multiply Linked List)

multiplylinkedlist

typedef struct node
{
    vector<struct node *> pointers;
    void* data;
}Node;
* 각 노드가 2개이상의 노드를 가리킨다.
> 원형 연결 리스트(Circular Linked List)

circularlinkedlist

* 리스트의 마지막 노드가 멀리있는 다른 노드(보통 첫번째 노드)를 가리키고 있는 형태이다.
* 원형 이중 연결 리스트(circular doubly linked list)의 경우는 첫번째 노드의 prev는 마지막 노드를, 마지막 노드의 next는 첫번째 노드를 가리킨다.

<링크 : 위키문서(Linked list)> 참조